pwnable.tw - start
Posted PolluxAvenger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwnable.tw - start相关的知识,希望对你有一定的参考价值。
首先安装 pwntools,在执行pip install --upgrade pwntools
时出错 cannot import name main
要修改 /usr/bin/pip
from pip import main
为
from pip import __main__
sys.exit(__main__._main())
再次执行即可
安装 peda
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
检查安全措施
可以看到非可执行栈(NX),peda 检查二进制程序安全特征的脚本来自 http://www.trapkit.de/tools/checksec.sh
查看检查 NX 部分的脚本为
if readelf -W -l $1 2>/dev/null | grep 'GNU_STACK' | grep -q 'RWE'; then
echo -n -e '\\033[31mNX disabled\\033[m'
else
echo -n -e '\\033[32mNX enabled\\033[m'
fi
程序分析
IDA 中分析两个函数,start 与 exit
反编译后:
exit 函数为:
没有 main 函数,可能是内联汇编写的程序。系统调用通过 int 80h 实现,执行时 eax 中为调用的功能号,ebx、ecx、edx 等以此为参数。系统调用号写在 /usr/include/asm/unistd.h
中
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
可以看到,IDA 将 sys_write 和 sys_exit 函数识别出来了,而 sys_read 没有成功识别
使用 sys_write 调用,即 int 80h 前 eax 为 4,ebx 为文件描述符 fd,stdout 的文件描述符为 1,ecx 为 buffer 的内存地址,edx 为 buffer 的长度
所以 start 函数主要是
- exit 函数压栈
- 清空 eax、ebx、ecx、edx 寄存器的值
- 向栈中压入数据
- 调用 sys_write 系统调用
- 调用 sys_read 系统调用
- retn 返回
依次压入栈的数据为:
3A465443h
20656874h
20747261h
74732073h
2774654Ch
整理一下为 4C657427732073746172742074687420746865204354463A
,将十六进制转换为字符串为 Let's start tht the CTF:
在调用 sys_read 系统调用前,修改 eax 为 3 自不必说,ebx 改为了 0 即 stdin,edx 改为了 3Ch
以上是关于pwnable.tw - start的主要内容,如果未能解决你的问题,请参考以下文章