【逆向分析】BUUCTF 逆向题目 [BJDCTF2020]JustRE
题目地址:
https://buuoj.cn/challenges#[BJDCTF2020]JustREhttps://files.buuoj.cn/files/b02a88388c5a572e39c2d40b8e9136fc/attachment.exe首先,查壳
信息:文件名: H:/第七届“强网杯”全国网络安全挑战赛/BUUCTF/[BJDCTF2020]JustRE/attachment.exe大小: 40855(39.90 KiB)操作系统: Windows(95)架构: I386模式: 32 位类型: GUI字节序: LE
使用IDA32打开文件
Shift+F12
.data:00407030 aBjdDD2069a4579 db ' BJD{%d%d2069a45792d233ac}',0交叉引用
F5
sprintf(String, " BJD{%d%d2069a45792d233ac}", 19999, 0);sprintf
把格式化的数据写入某个字符串
int sprintf( char *buffer, const char *format, [ argument] … );字串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
%% 印出百分比符号,不转换。
%c 整数转成对应的 ASCII 字元。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 整数转成字符串。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。
$money = 123.1
$formatted = sprintf ("%06.2f", $money); // 此时变数 $ formatted 值为 "123.10"
$formatted = sprintf ("%08.2f", $money); // 此时变数 $ formatted 值为 "00123.10"
$formatted = sprintf ("%-08.2f", $money); // 此时变数 $ formatted 值为 "123.1000"
$formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化为百分比
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
#include <stdio.h>int main() {// Use a constant for the buffer sizeconst int bufferSize = 0x100;char String[bufferSize];// Use snprintf to avoid potential buffer overflowint writtenChars = snprintf(String, bufferSize, "BJD{%d%d2069a45792d233ac}", 19999, 0);// Check for snprintf failureif (writtenChars < 0 || writtenChars >= bufferSize) {fprintf(stderr, "Error: Buffer overflow or snprintf failure\n");return 1;}// Use fputs instead of puts for better control (no automatic newline)if (fputs(String, stdout) == EOF) {fprintf(stderr, "Error: fputs failed\n");return 1;}return 0;}
flag{1999902069a45792d233ac}