调试
常用命令
info functions :显示程序的使用的函数
disassemble 函数名 :反汇编指定函数
查看内存命令x/<n/f/u>
n是一个正整数,表示显示内存的长度f 表示显示的格式
u表示从当前地址往后请求的字节数(u参数可以用下面的字符来代替b表示单字节,h表示双字节,w表示四字节,g表示八字节)
编译arm架构程序并用qemu执行
1 | 编译 |
typo(例题)
32位arm小端,静态编译,没有符号表
恢复符号表
对于静态编译的 bianry, 可以使用 lscan, flirt, rizzo, bindiff 等多种方法恢复部分符号表
https://www.freebuf.com/articles/terminal/134980.html
arm架构的libc在 /usr/arm-linux-gnueabihf/lib里面
尝试恢复符号表:
(1)下载对应libc.so
sudo apt install libc6-armhf-cross cp /usr/arm-linux-gnueabihf/lib/libc-2.23.so ./
(2)下载rizzo插件
使用rizzo插件:
https://github.com/fireundubh/IDA7-Rizzo
放入:C:\Program Files\IDA 7.0\plugins
(3)用IDA打开libc-2.23.so
导出libc.23.so.riz:
File->Produce file->Rizzo signature file
(4)打开目标程序
加载.riz:
File->Load file->Rizzo signature file
溢出函数
arm架构下32bit程序,函数的前四个参数分别保存在r0~r3寄存器中,其余的参数在栈中,函数返回值 保存在寄存器r0中。
找到0x20904,将“/bin/sh”地址赋给r0,并将system的地址赋给pc,就可以执行system(“/bin/sh”)
1 | from pwn import * |