返回信息流https://blog.csdn.net/u012763794/article/details/51992512#commentsedit
在这篇博客看到pwnable.kr的passcode这道题的解法,有一点小问题。这是C代码:
这是解法:
这是部分汇编代码
想问一下这解题过程的指令执行的情况是什么样的呢?应该是将passcode1用printf的地址覆盖对吧,但是为什么后面的再加上“/bin/cat flag”对应的地址就能打印出flag呢?
这是一条镜像帖。来源:北邮人论坛 / security / #44432同步于 2019/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
【问题】有没有大佬可以帮忙看一下这道pwn的题目
haoxiantong
2019/10/28镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这题是这样的:
1. 首先由于缺少&导致第一个passcode1 是到栈上去取数据当做指针来用
2. 而welcome那里调用过以后栈并没有清除又重新调用了login(栈的复用)从而脏数据导致scanf那里取passcode1 正好是这个脏数据
也就是说从welcome这里可以输入一段被后面作为地址写入,而在scanf这里就有个任意地址写了
3. 这里原来的blog有个错误,此处并非写printf@plt 而是printf@got 这个与elf执行的lazy binding有关,具体可参考《程序员的自我修养》。
而调用printf时实际上是调用printf@got位置的内容,如果修改了printf@got的内容,就可以劫持eip了,也就是控制流。
4. 那么要跳转到哪里? 联系一下程序逻辑看汇编,这个位置是压入"/bin/cat flag"参数来调用system,就是执行system("cat flag"),自然就可以打印出flag了。
ps. 此处并非只能修改printf@got,修改flush@got也可, 具体原因可以看完plt、got就理解了。
好久之前写过这个题目的wp,链接如下,也可作为参考:https://www.cnblogs.com/p4nda/p/7122094.html
感谢大佬,明天再细看[ema11]
【 在 panda2608 (【意涵团】p4nda) 的大作中提到: 】
: 这题是这样的:
: 1. 首先由于缺少&导致第一个passcode1 是到栈上去取数据当做指针来用
: 2. 而welcome那里调用过以后栈并没有清除又重新调用了login(栈的复用)从而脏数据导致scanf那里取passcode1 正好是这个脏数据
: ...................
pwnda pwnda. gif
【 在 panda2608 (【意涵团】p4nda) 的大作中提到: 】
: 这题是这样的:
: 1. 首先由于缺少&导致第一个passcode1 是到栈上去取数据当做指针来用
: 2. 而welcome那里调用过以后栈并没有清除又重新调用了login(栈的复用)从而脏数据导致scanf那里取passcode1 正好是这个脏数据
: ...................