CTF-bugku-PWN

一. PWN1

题目:nc 114.116.54.89 10001

 

 1.  直接kali里面跑nc

 

 2.ls看看有啥

 

 3.明显有一个flag

cat查看一下

 

 搞定

 

 

二 . PWN2

题目:给了nc 114.116.54.89 10003还给了一个附件

 

 1.放到ubantu中file一下,,64位,动态链接

 

 2.用64位的ida打开

 

 看一下main函数按f5,可知read函数有一个缓冲区漏洞

 后面还有一个getshell函数

 那么思路也就是把溢出的地址改为getshell函数执行的地址

在gdb动态调试程序

 按c继续执行

click 100,整100个字符串测试偏移地址

cyclic 100
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaa

 

看看栈的情况,第一行这个栈保存了44个字符

 看看寄存器的情况,可以知道ret之前保存了44个字符,也就说另外56个字符是填满了ret后面的区域

 

 那么56个字符之后就是getshell的地址(写poc getshell地址的时候记得小端法)

三.pwn4

1.首先拿到程序不要慌 看看是什么文件,有没有什么保护措施

file pwn4 很清楚是64位 动态的

 checksec看看有没有保护措施 很显然没有

 2.知道没有什么保护措施  我们就放到ida 深入分析一下

 mian函数进去看看是啥,很明显哈  可以看到read这个函数出现缓冲区溢出的问题

 这个时候 我们清楚是缓冲区溢出了 ,就要看看这个程序里面有没有什么shell 或者什么'/bin/sh'

目的是为了溢出之后直接覆盖让他执行shell

shift+F12:查找字符串

 可以i看见有个shll  双击进去看看

 可以发现这个shell就是个字符串没啥用

我们直接搜一下有没有'/bin/sh'

ROPgadget --binary pwn4 --string '/bin/sh'

 可以发现啥都没有重新查看一下字符串,可以发现有个$0这个在linux就可以当作shell,

 接下来的思路就是把这个$0当参数传进system函数,为啥要传入system函数呢

原因就是因为system()会调用fork()产生子进程,由子进程来调用/bin/sh -c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。

意思就是 system可以调用fork()产生子进程  让$0执行,不然$0是不是只是一个字符串呢,不能当作程序执行就没有意义,system函数就饿可以执行它

好,既然要把$0当参数传进system函数,我们就要知道三个东西

1.因为64位依赖寄存器传参 当然有很多寄存器 这玩意是由顺序的,不是说哪个存都行,这里面就一个参数 所以rdi先存,顺序是分别用rdirsirdxrcxr8r9来传递参数。所以得知道rdi的地址

2.得知道$0的地址吧

3.system地址得知道吧

好一个个来

先是rdi,可以看见是0x00000000004007d3

 $0的地址 0x000000000060111f 

 system直接看0x000000000040075A

3.就可以写exp把他们串起来

emmm思路是这样

先先填充缓冲区,大小为0x10,然后覆盖rbp,因为是64位所以8个字节,传入rdi,咋传呢 pop就行了 然后传入ret的地址和$0,将栈中$0的地址弹出,存入rdi作为参数,再传入system地址进行调用

 exp借用deedmind老哥!感谢

 成功拿到flag

原文地址:https://www.cnblogs.com/cat47/p/12347420.html