pwnable.tw - start

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tan6600/article/details/80963747

首先安装 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

检查安全措施

image_1chhvhv5g1cq1lp41g9m9sr16u29.png-15.4kB

可以看到非可执行栈(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
image_1chi17pjb1pko1uua1sl91ih7shm.png-19.1kB
反编译后:
image_1chi109d5htr9sd1plv1cb01v989.png-9.4kB

exit 函数为:
image_1chi3bbpp1o858f1kkm12e5rec13.png-7.9kB

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页