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

检查安全措施

pwnable.tw - start_第1张图片

可以看到非可执行栈(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
pwnable.tw - start_第2张图片
反编译后:
pwnable.tw - start_第3张图片

exit 函数为:
pwnable.tw - start_第4张图片

没有 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

你可能感兴趣的:(二进制漏洞)