CTF随笔(二)

##PWN001 ssh fd@pwnable.kr -p2222 (pw:guest) 送分题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
        //接收参数,当参数不存在时,返回请输入参数
        if(argc<2){
                printf("pass argv[1] a number\n");
                return 0;
        }
        //将参数从char*转换为int值减去0x1234
        int fd = atoi( argv[1] ) - 0x1234;
        int len = 0;
        //从fb指针开始往后读32个字节的字符并存于buf中
        len = read(fd, buf, 32);
        //拷贝字符,当buf中的字符与LETMEWIN\n相同时,输出flag并退出程序
        if(!strcmp("LETMEWIN\n", buf)){
                printf("good job :)\n");
                system("/bin/cat flag");
                exit(0);
        }
        printf("learn about Linux file IO\n");
        return 0;

}

那么我们的fb指针肯定要指向0x000开始,所以我们需要把fd置空,计算器算一下

输入指令

./fd 4660

然后输入LETMEWIN

GET FLAG

PWN002

ssh col@pwnable.kr -p2222 (pw:guest)

取得代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

unsigned long hashcode = 0x21DD09EC;

unsigned long check_password(const char *p) {
    int *ip = (int *) p;
    int i;
    int res = 0;
    for (i = 0; i < 5; i++) {
        std::cout<<ip[i]<<std::endl;
        res += ip[i];
    }
    return res;
}

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("usage : %s [passcode]\n", argv[0]);
        return 0;
    }
    std::cout<<argv[1]<<std::endl;
    if (strlen(argv[1]) != 20) {
        printf("passcode length should be 20 bytes\n");
        return 0;
    }

    if (hashcode == check_password(argv[1])) {
        system("/bin/cat flag");
        return 0;
    } else
        printf("wrong passcode.\n");
    return 0;
}

调试结果试试

11111111111111111111

得出

查了查ASCLL表刚好字符'1'的hex是\31\31\31对应的10进制为825307441

里面的

21DD09EC

计算器计算的结果如下

568134124

而res的值恰好为这些数字相加,也就是说,这个hashcode的结果为这些数相加的整数和 上python构造

\x01\x01\x01\x01 + \x01\x01\x01\x01 + \x01\x01\x01\x01 + \x01\x01\x01\x01 + \x1D\xD9\x05\xE8

管道执行col.exe(linux下直接是col)

./col $(python -c 'print "\xE8\x05\xD9\x1D" + 16*"\x01"') #调用python执行输入到./col中

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

python: reduce函数

python3 中,reduce()函数已经被从 全局名字空间 里移除了。 转而被放置到了 fucntools模块里 。

12430
来自专栏Vamei实验室

Python标准库08 多线程与同步 (threading包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! Python主要通过标准库中的thread...

27650
来自专栏java架构师

Unit断言学习

[TestMethod]—用于把一个方法标记为一个测试方法。当你运行你的测试时,仅标记有这个属性的方法才能够运行。 [TestClass]—用于把一个类标记为...

278110
来自专栏逆向技术

框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)

       框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如  CObje...

22360
来自专栏北京马哥教育

只需9个步骤,完美实现自动化运维异常处理!

1异常 异常就是非正常状态,在Python中使用异常对象来表示异常。若程序在编译或运行过程中发生错误,程序的执行过程就会发生改变,抛出异常对象,程序流进入异常处...

32250
来自专栏calmound

Single Number II

问题:找出只出现一次的数,其他数出现了三次 分析:将数转化为二进制的位,数出现了三次相当于其对应的二进制上每个位置出现了3次,这里有个抽象的地方就是,例如数中包...

29350
来自专栏开源优测

JMeter函数和变量11

前言 在jmeter中提供了功能强大的内置函数来帮助我们处理字符串、文件读写、计算、运行外部脚本等等能力。 要想在项目中切实运用来jmeter完成复杂的压测场景...

46860
来自专栏架构之路

C++的extern关键字知识点

转载自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 感觉写的比百毒上搜...

33940
来自专栏生信宝典

Linux学习 - SED操作,awk的姊妹篇

awk和sed想一对兄妹,一个出现,就会问起另一个。现在,都来了。 sed基本参数解释 sed是stream editor的简称,擅长对文件进行各种正则操作、插...

22960
来自专栏desperate633

深度解析Java多线程的内存模型内部java内存模型硬件层面的内存模型Java内存模型和硬件内存模型的联系小结

Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操作系统,作为一个操作系统就有内存模型,这就是我们常说的JAVA内存模...

8010

扫码关注云+社区

领取腾讯云代金券