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

检查安全措施

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值