PWN初见栈溢出V0.0.1

admin 2022年8月27日23:32:08CTF专场评论1 views1038字阅读3分27秒阅读模式

栈溢出常见的利用方法:ret2text,ret2shellcode,ret2syscall,ret2libc等

先从最简单的ret2text开始

确定偏移:

可以使用cyclic生成每4位都不重复字符串,将字符串传入gdb调试的程序中,观察eip的值,使用cyclic -l 查看偏移,也可用ida查看

PWN初见栈溢出V0.0.1

PWN初见栈溢出V0.0.1

得到偏移为13(十进制)

ida(有时候会不准)

PWN初见栈溢出V0.0.1

s到ebp偏移9,程序为32位,再加4为13

PWN初见栈溢出V0.0.1

也可以点进变量s(-9)到r(+4)偏移为13

main里面输出了一些字符然后调用的pwnme函数,明显pwnme函数存在栈溢出,偏移是13

PWN初见栈溢出V0.0.1

PWN初见栈溢出V0.0.1



随便点点ida里的函数列表发现,stack函数里存在system("/bin/sh")

PWN初见栈溢出V0.0.1

只需要把返回地址覆盖成system("/bin/sh")的地址就行了,这块地址是0x08048518

PWN初见栈溢出V0.0.1


poc

p32是小端传输,可以理解为打包,u32就是解包emmm

PWN初见栈溢出V0.0.1

运行下确实拿到shell了,还是蛮有意思的

PWN初见栈溢出V0.0.1

ret2shellcode,一般都是存入shellcode,再用vmmap查看存放shellcode的区域是否具有可执行权限(没权限可以尝试加),return到shellcode的对应的地址就行

ret2syscall系统调用

32位应用程序调用系统调用的过程是:

1.把系统调用的编号存入 EAX;

2.把函数参数存入其它通用寄存器(EBX(第一个参数),ECX(第二个参数),EDX(第三个参数));

3.触发 0x80 号中断(int 0x80)。

网上有系统调用表,但是我访问域名已经过期了(寄),待解决。。。

一般调用execve("/bin/sh",NULL,NULL),调用号0xb,EBX传/bin/sh,ECX和EDX传0

ret2libc的流程,一般是先通过libc中的函数(__libc_start_main)的地址确认libc版本,system和/bin/sh在libc中的偏移是固定的。

system的地址=__libc_start_main的地址-__libc_start_main在libc中的偏移+system在libc中的偏移,/bin/sh也同理

使用LibcSearcher,可以通过libc.dump('system')、libc.dump('str_bin_sh')

来获得system和、/bin/sh偏移


工具:pwntools、ROPgadget、LibcSearcher、gdb


原文始发于微信公众号(夺旗赛小萌新):PWN初见栈溢出V0.0.1

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月27日23:32:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  PWN初见栈溢出V0.0.1 http://cn-sec.com/archives/1257944.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: