IDA Pro+GDB动态调试TEW654

使用TEW654固件,来到sq-root文件夹下,复制qemu-mipsel到此目录下,并测试运行

如果运行的qemu-mips与实际架构不匹配,执行会报错

ok,执行测试成功,下一步就是要启动my_cgi.cgi程序

idapro载入分析,在main函数入口查看程序执行需要哪些参数

在main入口,首先判断第一个参数REQUEST_METHOD

如果参数是GET,则程序直接跳转到结束位置。

接下来需要传递三个参数CONTENT_LENGTH, CONTENT_TYPE, REMOTE_ADDR

接下来根据获取的device_mode是否非零非1,访问不同的数据库,其中rt.db是相对较大的数据库,感觉更像是系统管理员使用的数据库

apc.db比ap.db更多的是一些client的tables

之后调用open_db,get_input_entries,check_remote_ip

然后根据传递的参数进行一些操作等

其中查看函数get_input_entries,可以看到根据stdin传过来的值,需要比较其中的=和&符号,也就是最常见的POST传递的参数写法,像 user=a&pwd=b

暂不考虑数据库之类的操作,根据以上分析,我们需要设定几个初始化参数用于开启登录,然后使用POST输入的方式传递登录用户名密码等,bash脚本如下

#!/bin/bash

INPUT="$1"
LEN=$(echo -n "$INPUT" | wc -c)
PORT="1234"

if [ "$LEN" == "0" ] || [ "$INPUT" == "-h" ] || [ "$UID" != "0" ]
then
	echo -e "\nUsage: sudo $0 \n"
	exit 1
fi

cp $(which qemu-mipsel) ./qemu

echo "$INPUT" | chroot . ./qemu -E REQUEST_METHOD="POST" -E CONTENT_LENGTH=$LEN -E CONTENT_TYPE="application/x-www-form-urlencoded" -E REMOTE_ADDR="1.1.1.100" -g $PORT /usr/bin/my_cgi.cgi 2>/dev/null

rm -f ./qemu

运行此程序,加上post传递的参数

bash ./mycgi.sh “request=login&user_name=admin&user_pwd=’%20or%20’1’%3D’1”

当看到程序执行暂停,说明在等待调试器连接

设置idapro远程gdb调试配置

设置完成,选择Debugger/Attach to process

根据分析的strings关键字,在exec_sql执行时设置断点

idapro运行,执行到断点处,此时寄存器$A1的值为0x00484508

查看此地址内存内容,发现全是?,其实根据颜色也能判断这是有内容的,只是idapro没能分析出来

原因在于,当idapro开启gdb调试时,会提示当前调试器下,内存内容不可见,需要在Debugger/Manual memory regions下进行设置

根据bss段起止,将其起始和终点地址都设置一下

起始为0x0045a698

结束地址为0x00484820

输入起止地址

可以看到多出来此内容区域

这段默认全?的数据变为全00,再跳转到$A1地址,可以看到此寄存器指示的地址显示的就是登陆输入的用户名密码内容,也可以验证此处的SQL语句是存在万能密码注入漏洞的

或者用第二种方法,不用idapro,直接使用mips gdb开启调试

连接1234端口进行调试

根据idapro中的分析,设置断点位置在0x0040b710,然后c执行

可以看到此时寄存器$A1的值为0x00484508

查看此地址处内容,也可以看到拼接的SQL注入语句

参考资料:

您可能还喜欢...