pwnable 笔记 Toddler's Bottle -passcode

题目

这里写图片描述

用ssh连接一下

这里写图片描述

运行一下passcode

这里写图片描述

竟然发现错误。。
可以发现需要输入 name passcode1 passcode2

再查看一下源代码

这里写图片描述

这个题一共有两个函数welcome()和login()
welcome中输入了name,并且字符串大小是100
login中输入了pass code1 和passcode2
在passcode1=338150(0x528E6)并且passcode2=13371337(0xCC07C9)的时候返回shell,得到flag。

从源代码中可以看出,使用scanf()函数时没有加地址符号&

通过代码可以看到在执行了welcome函数后立即执行了login函数,中间没有压栈弹栈操作,也没有开alsr等保护,因此二者的ebp是相同的。

先看一下函数

main函数

直接看汇编看不懂 用下peda

在welcome函数下一个断点 分析一下main函数

welcome函数

在这个地址中输入得%100s 明显是name 大小100

所以下面的edx就是name的地址了 ebp-0x70

继续进入login函数

login函数

由这也发现login和welcome函数的ebp是一样的

这里写图片描述

又到了scanf函数

那么ebp--0x10 就是passcode1的地址

继续运行
程序崩溃了
scanf没有加地址符号说明passcode1指向了一个不可写的地址

通过计算可以知道,name 与 passcode1 的地址相差 96 个字节(0x70 - 0x10 = 96,而我们可以控制的 name 刚好能够到 100 个字节,也就是说,我们刚好能够控制 passcode1 的值

看一下login函数调用了哪些函数

这里写图片描述

我们们可以把 name 的最后四个字节写成 plt 中 printf fflush exit函数的地址,然后在输入 passcode1 时输入调用 system 函数的地址,即 0x080485e3
注意函数调用前还有给参数赋值等初始化操作

又因为scanf的时候用的%d所以要把system的地址转换成十进制

payload = a’*96 +‘\x00\xa0\x04\x08’+134514147\n
python -c "print 'A' * 96 + '\x00\xa0\x04\x08' + '134514147\n'" | ./passcode

FLAG: Sorry mom… I got confused about scanf usage ?


科普
0x01.GOT和PLT表简介

GOT表:
概念:每一个外部定义的符号在全局偏移表(Global offset Table )中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。
作用:把位置无关的地址计算重定位到一个绝对地址。程序首次调用某个库函数时,运行时连接编辑器(rtld)找到相应的符号,并将它重定位到GOT之后每次调用这个函数都会将控制权直接转向那个位置,而不再调用rtld。

PLT:过程连接表,一个PLT条目对应一个GOT条目
当main函数开始,会请求plt中这个函数的对应GOT地址,如果第一次调用那么GOT会重定位到plt,并向栈中压入一个偏移,程序的执行回到_init()函数,rtld得以调用就可以定位printf的符号地址,第二次运行程序再次调用这个函数时程序跳入plt,对应的GOT入口点就是真实的函数入口地址。
动态连接器并不会把动态库函数在编译的时候就包含到ELF文件中,仅仅是在这个ELF被加载的时候,才会把那些动态函库数代码加载进来,之前系统只会在ELF文件中的GOT中保留一个调用地址。
http://www.programlife.net/linux-got-plt.html
http://blog.csdn.net/lmh12506/article/details/6801630
这里面有详细的介绍linux的got和plt

0x02.gdb常用调试指令

https://deepzz.com/post/gdb-debug.html

参考:
http://www.cnblogs.com/p4nda/p/7122094.html
https://blog.csdn.net/qq_20307987/article/details/51303824
https://chybeta.github.io/2017/04/08/Pwnable-kr-passcode/
https://www.jianshu.com/p/886a7b8c2ad5
https://www.google.com/search?q=got表覆写+ctf&oq=got表覆写+ctf&aqs=chrome..69i57.14403j0j7&sourceid=chrome&ie=UTF-8

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值