pwnable.kr之simple Login

懒了几天,一边看malloc.c的源码,一边看华庭的PDF。今天佛系做题,到pwnable.kr上打开了simple Login这道题,但是这道题个人觉得不simple,没有独立完成,看了wp,学到新的思路。

其实说实话,原理并不复杂,这道题比较难的地方,是它的结构比较复杂,溢出空间很小,而且很隐蔽。

这是主函数的伪代码,Base64Decode函数实现对输入内容进行base64解码,auth函数会生成解码内容的md5哈希值,并且与程序中保存的hash值对比。

v5变量在这里没毛作用,正常的代码里应该没有这些个变量,这里应该是IDA的问题。

这个函数里,就是进行了一下base64的解码。

getshell的函数在这里。

溢出点在auth函数这里,注意一下,这里的v10是auth的实参,v10是base64解码之后的长度,当v10>12的时候,会输出“wrong lenth”,然后退出进程。

但是这里memcpy,目的地址v5所在位置是[ebp-8h],所以,如果v10=12的时候,就会覆盖ebp寄存器所指向的栈基地址。

这里就到了比较搞的地方了,因为题目开启了NX,Canary保护(这个没啥用),我们其实无法将shellcode布置在栈区来执行,溢出空间很小,也没办法覆盖返回地址来劫持程序的控制流。

这时候其实要留意一点,最后有一个memcpy,是把解码之后的填充数据copy到了input地址处,在程序没有开启PIE保护的情况下,input地址我们是可以知道的,我们可以同过劫持栈指针的方式,把数据布置到input所在的bss段,在执行完main函数后,在bss段执行我们的shellcode。

这里,思路就很清晰了,唯一要注意的就是,mov ebp,esp;pop ebp的时候,esp寄存器的值要减4,所以payload的前四个字节填充垃圾数据。

from pwn import *

#io=process('./login')
io=remote('pwnable.kr',9003)
input_addr=0x0811EB40
#correct_addr=0x0804925F
correct_addr=0x08049284 io.recvuntil(":")
payload='a'*4+p32(correct_addr)+p32(input_addr)
io.send(payload.encode('base64'))
io.interactive()

exp如上所示,比较简单,但是背后的思维值得推敲。

留意一点:跳转getshell的时候,跳转到correct函数中的system函数处,不然的话,由于它前面还有一句输出,无法getshell。

最新文章

  1. C#——字段和属性
  2. Centos6.5安装mysql不能启动,应该安装mysql-server
  3. 【转载】调试利器 autoexp.dat
  4. 为bootstrap添加更多自定义图标
  5. APP链接请求电话
  6. gulp.spritesmith修改px为rem单位
  7. 编写一个递归函数,输出vector对象的内容
  8. sql server 2008 在与 SQL Server 提示建立连接时出现与网络相关的或特定于实例的错误
  9. Ubuntu 14.04 Android 使用Maven一个 用例project
  10. [Django1.6]The MEDIA_ROOT and STATIC_ROOT settings must different 解决
  11. 1.cocos2dx存储卡的游戏代码、而游戏移植到“华为荣耀”电话、问题的总结移植
  12. jquery数据验证插件
  13. FastDFS迁移步骤
  14. win快捷键
  15. opensetting禁用后小程序二次授权的问题-以及根据定位城市获取天气
  16. 第二个spring,第三天
  17. Linux proc目录下 几个系统文件下的各项参数 (cpuinfo,uptime,meminfo,stat,loadavg)
  18. Android——Android Sutido:[2]导入eclipse项目篇
  19. C/C++基础----类
  20. Spring事务控制和传递性理解

热门文章

  1. 在Excel中当遇到多个对象的目标值都不同时,如何快速设置条件格式突出未达标的对象
  2. Java基础之(一)——从synchronized优化看Java锁概念
  3. 7.8、如何制作openstack镜像
  4. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
  5. Redisson 分布式锁源码 09:RedLock 红锁的故事
  6. 重新整理 .net core 实践篇————配置中心[四十三]
  7. 我用段子讲.NET之依赖注入其二
  8. Rust 与 Golang - 何时使用它们?
  9. Oracle如何以逗号分隔的字符串拆分为多行数据
  10. 机器学习Sklearn系列:(四)朴素贝叶斯