checksec
32 位的程序,没有开pie
代码如下
首先会将 _bss_start 也就是 IO_STDOUT 的地址打印出来
嘛,不管是什么,总之这个是libc里面的地址,有了这个就可以泄露出libc的地址了
leak_memory 之后程序要求一个数字,数字输入之后直接将这个数字 v4 作为函数来进行调用
没有想到什么好办法,又不能写shellcode,所以这里就直接找题目的libc的one_gadget 的偏移,然后传入地址即可
不过需要注意这里v4 是无符号数,需要进行一下转换,调试看看就清楚了
服务器上有 pwntools, 所以这里就直接在服务器上进行测试了,效果如下
okay, 搞定了 exploitable, 看到还有一道unexploitable, 继续搞搞
checksec 看一下
64 位的程序,没有 canary, 没开 PIE
ida 打开看看
程序逻辑很简单,进来先 sleep 3s,然后 read 0x50f 个 byte, buf 的大小为0x10, 所以直接就是一个heap overflow
这样就可以rop 来控制程序的执行流了
但是程序很简单, 只有一个 read以及 sleep 函数,要调用system, execve 函数什么的我至少要有一个leak吧
这里完全没有输出的函数,所以没有 leak
可以想到的就几个方法
1 dlresolve 但是这个程序是 64 位,仍需要leak link_map
2 搞shellcode 开了 NX,又没有 mmap,mprotect 等函数,有点难搞
3 srop ?? srop 貌似可以的样子,不过需要有一个 signature 系统调用
找一下有没有可用gadget 先
居然真有 syscall, 不过这个syscall 是在字节码 0f 05 在 mov edx,0x50f 形成的,
很好,有了syscall 就可以搞很多事情了事情了
首先是 系统调用表
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
有两个思路
1 使用 15 号系统调用 sys_rt_sigreturn 来构造srop
2 直接 read 读入一个 /bin/sh 然后 调用 execve 来getshell
主要就是寄存器的控制,rax可以通过sleep 函数或者 read 函数的返回值来进行设置,这里就需要用到通用gadget了,可以看一下
一步一步学ROP之linux_x64篇 - 蒸米
嘛,这里方便起见就直接使用srop了
利用思路如下
1 溢出设置 rsi ret 返回调用read 函数读入 0xf 个字符到 bss,("/bin/sh\x00".ljust(8,"\x00")
2 0xf 为 sys_rt_sigreturn 将对应的寄存器设置为sys_execve 需要的参数,然后就可以直接调用 execve("/bin/sh\x00",0,0) 了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课