任务三 Pwn100任务

gdb

https://blog.****.net/zdy0_2004/article/details/80102076
内容很详细

  1.   编译带调试信息的可执行程序:用gcc(g++)编译的时候带上-g选项即可
    
  2.   启动GDB开始调试
    

(1)gdb program ///最常用的用gdb启动程序,开始调试的方式
(2)gdb program core ///用gdb查看core dump文件,跟踪程序core的原因
(3)gdb program pid ///用gdb调试已经开始运行的程序,指定pid即可
3. 应用程序带命令行参数的情况,可以通过下面三种方法启动:

(1)启动GDB的时候,加上–args选项,然后把应用程序和其命令行参数带在后面,具体格式为:gdb --args program args

(2)先按1中讲的方法启动GDB,然后在执行run命令的时候,后面加上参数

(3)先按1中讲的方法启动GDB,然后用set argsarglist设置命令行参数,接下来再执行run®命令运行程序

  1.   退出GDB:
    

(1)End-of-File(Ctrl+d)

(2)quit或者q

  1.   在GDB调试程序的时候执行shell命令:
    

(1)shellcommand args(也可以先执行shell命令,GDB会退出到当前shell,执行完command后,然后在shell中执行exit命令,便可回到GDB)

(2)makemake-args(等同于shell makemake-args)

  1.   在GDB中获取帮助:
    

(1)在GDB中执行help命令,可以得到如图1所示的帮助信息:

安装gdb和插件peda
用which gdb即可检验gdb安装是否正常
peda的安装网上安装很多语句
任务三 Pwn100任务

任务调试

在任务2的时候因为用linux-server而不是用linux-server64所以知道pwn100是32位。
用ida打开pwn100,f5查看反编译

首先查看main函数
任务三 Pwn100任务
这个函数里面buf长度远小于read函数中需要的长度,于是就会遇到栈溢出的问题呀~~~~

好的这里开始说重点,一看到的时候根本不知道要干啥,查看ida可以看到有一个叫做getflag的函数,点开看一看,所以思路是将返回地址覆盖为getflag的地址,执行flag函数,然后泄出flag

确定溢出点位置
利用gdb,然后pattern create 一定长度的字符执行找到无法运行的位置

任务三 Pwn100任务
任务三 Pwn100任务
任务三 Pwn100任务
任务三 Pwn100任务
记得产生的字符串在复制的时候前后的“ ,”不要复制,不然执行得到的长度会有偏差像上面的图变成111,本应该是112.

gdb ./pwn00启动gdb

pattern create 200去创造一定长度的字符串
r执行
复制产生的字符串执行,找到无法继续执行下去的位置
pattern offset *无法执行下去的位置*
得到每次覆盖的字符串长度
这个长度还有一种算法,计算从buf的起始地址到argc+4的总长度

可以开始写exp了,这个pwntools装了我好久好久,建议用16版的ubuntu,我14版的死活有问题
安装方法
sudo apt-get update

sudo apt install python-pip
sudo pip install pwntools

任务三 Pwn100任务
任务三 Pwn100任务
任务三 Pwn100任务
任务三 Pwn100任务
任务三 Pwn100任务
安装很可能出问题,神奇的很,自求多福,不行多拜拜神,我装了好多次一开始都不行。装好之后检查安装是否成功

首先终端启动python
输入 import pwn
如果运行如上图就说明安装成功了

任务三 Pwn100任务
exp不是很会写,主要是根据别人教程的模板写的,主要是payload的公式,padding1+32地址

执行完发现flag是假的。。。。。。再看看getflag函数,你会发现没有里面要的flag.txt,所以,自己新建一个flag文件,里面随便写东西。然后,运行得到真的flag,自己写的flag
任务三 Pwn100任务
任务三 Pwn100任务

好了基本就是这样了,我个人觉得主要是拿到之后不知道要干啥,栈溢出是个要好好研究的东西,我会再研究研究pwntools用法,好好理解一下。