HackThebox Lesson
每日一更 HackThebox 系列
这次没有攻击和靶机的环境因为开新篇章的缘故 所以现在在更新PWN的题目 以后每日一更的都属于那种相对简单的 更深层次的我会放在后面继续更新 话不多说开始
下载文件
到Linux解压
解压出来就是这样 先看README.txt
enmmmm 这是个基础题 要你去链接他的服务器 然后根据题目做题类似这种非常基础
他的服务器地址在上面截图上是有的 直接nc 连接就是了
一个一个看
一开始误会了 这里题目是问 这是个多少位的程序 (我还在那疯狂运行报错)
这个可以通过checksec 看
64位程序
问题二:哪个地方开启了不可写保护
NX 也是上一步就看到了
问题三: 如果想要 让他输出 "Welcome admin!" 你需要输入什么
这个就需要看看代码
C的代码
看到print_msg是控制输出什么的
这段代码是一个简单的函数,接受一个字符串指针作为参数,并根据该字符串的内容打印不同的欢迎消息。
让我们来分析一下:
void print_msg(char *user):这是一个函数声明,表明该函数名为print_msg,接受一个指向字符的指针作为参数,并且不返回任何值(void)。
char formatter[0x20];:在函数内部定义了一个长度为32字节(0x20的十六进制表示)的字符数组formatter,用于存储格式化后的用户输入。
# 重点1
strncpy(formatter, user, 5);:使用strncpy函数将user指针指向的字符串的前5个字符复制到formatter数组中。这里有一个潜在的问题是,如果user指向的字符串长度小于5,那么formatter中将不会以null结尾。
for (size_t i = 0; i < 5; i++) formatter[i] = tolower(formatter[i]);:将formatter数组中的前5个字符转换为小写字母,这样可以确保对大小写不敏感的比较。
# 重点2
printf(strncmp(formatter, "admin", 5) == 0 ? "\nWelcome admin!\n\n" : "\nWelcome user!\n\n");:根据比较formatter数组中的前5个字符与字符串"admin"的结果,选择性地打印不同的欢迎消息。如果相等,就打印"Welcome admin!",否则打印"Welcome user!"
我标出来两个重点都是要用到的 先看重点2 就是这题的答案 前5个字符如果等于admin 那就输出"Welcome admin!" 否则输出 "Welcome user"
所以这个题答案就是admin
问题四:name 有多大 0x20 这个上面定义就看到了 32 好像也行 他后面括号写 用 16进制或者10进制都可以
问题五:哪个函数没有被调用?
通过 我们看 main.c可以看到 under_construction()这个函数是全程没被调用的
问题六:哪个函数有可能造成缓冲区溢出?
这个需要去看C的相关资料 scanf()是有可能的 scanf_s()是安全的
问题7:输入 分别尝试30 39 40 个'A' 在输入第几个A的时候 会造成缓冲区溢出?
这个问题详细讲很难 虽然name的大小是32 但是 你输入到39 也没问题因为寄存器和栈的运行原理输入到39 是没问题的 到40 就会造成这个问题 后续我会单独出一个关于栈溢出的帖子
问题八:那个没被调用的函数under_construction()的地址是多少 用16进制表示出来
这个问题在于C 编译的原理 虽然每调用但是他是有地址的 只是没有call 这个地址的地方就是他存在但是没人用它 怎么看呢 可以用Windows可以用IDA Xdbg Linux直接
objdump -t main | grep under_construction
这个第一个就是他的地址 00000000004011d6
16进制就是 0x4011d6
最终获取到Flag 完结撒花