[HGAME 2021]whitegive

本文最后修改于 170 天前,部分内容可能已经过时!

为方便复现,同样将该题放在了我的复现平台上(https://ctf.donstpast.cn/)

1.前置知识

①c语言中等号比较

c语言等号比较==其作用相当于strcmp比较,它是比较两个字符串的指针地址,从而判断两个字符串是否相同

function StrComp(const Str1, Str2: PChar): Integer; $[SysUtils.pas

功能 返回比较两个指针字符串

②scanf中fscanf类型说明符

类型 合格输入 参数类型
C 单个字符:读取下一个字符。如果指定的宽度不同于1,则该函数读取宽度字符并将其存储在作为参数传递的数组的连续位置中。在末尾没有空字符。 字符*
d 十进制整数:数字(可选)以+或-开头 整数*
e,E,f,g,G 浮点数:包含小数点的十进制数,可以选择在其前面加上+或-号,并可以选择在其后跟随e或E字符以及一个十进制数字。 浮动*
Ø 八进制整数: 整数*
s 字符串。这将读取后续字符,直到找到空白为止(空白字符被认为是空白,换行和制表符)。 字符*
ü 无符号十进制整数。 unsigned int *
x,X 十六进制整数 整数*

2.题目复现

1.png
我们可以看到,给提供了elf程序以及源码。这是week1的签到题,可惜当时依旧还是没有做出来,很拉胯。拿到题目,老样子,先file和checksec,可以看到是64位程序,开了canary和NX保护
2.png
3.png
因为有源码,所以我们就先查看源码,来理清结构。
4.png
代码结构很简单,就是定义了一个未初始化的很长的字符,获取我们的输入作为num的值,之后如果num等于PaSsw0rd,我们就可以获得bin/sh权限。刚看到嗷以为很简单喵,就直接将num赋值呗。因为开了NX保护,所以我们不能考虑栈溢出。此时我想着直接将内容传进去,之后调取bin/sh的地址,可惜失败了,后来尝试外部写入,依旧失败,最后是看了官方wp才知道,这个是考等号比较字符串,等号比较字符串说到底就是指针的比较所以,我们只需要找到PaSsw0rd所在的地址,把它传上去即可,因为scanf解析的是%d十进制整数,所以我们应该传入十进制整数的字符串,那么本题的脚本就可以写出来了
rax寄存器中PaSsw0rd内容的地址0x402012
5.png
脚本如下:

from pwn import *
p=remote("101.132.117.190",10004)
passwd_addr=0x402012
p.recvuntil(":")
p.sendline(str(passwd_addr))
p.interactive()

确实是个签到题的难度,因为太固定思维了,只想着用p64进行封包传参,才会导致这样。

Tags:复现wpCTFPwn
上一篇
下一篇

添加新评论

召唤看板娘