buuctf——youngter_drive

1.得到exe文件,查壳。

upx壳,32位文件。

2.脱壳。丢到IDA中找主函数,F5.

3.分析代码。有好多不知到的函数(枯了枯了),网搜一波,发现主要是在createthread函数,他就是建了个线程(可以把他忽略主要看参数里面蓝色的)

大致看一下代码关键就是三个函数:两个createthread函数还有一个sub_411190.

两个createthread函数都是加密用的,sub_411190就是比较。(flag就是那个score)

先看第一个startAddress:

继续跟进函数sub_41112c

这个函数就是先判断flag是不是大写字母,

是:a1[a2]==off_418000[a1[a2]-38]          不是:a1[a2]==off_418000[a1[a2]-96]

第二个sub_41119f:

这个主要是说上面的加密方式是一个见一个的(即奇数位加密,偶数位不加密)

(这两个线程好像是并行的)

最后是比较score和off_418004。查一下off_418004==‘TOiZiZtOrYaToUwPnToBsOaOapsyS’

(即加密后flag的值)

4.写脚本。

运行得到ThisisthreadofwindowshahaIsES。(我以为这就是falg就提交了,结果不对,想了半天不知道咋弄,就看了看大佬的wp,才发现有坑。)看sub_418008处的值是0x1D(29)所以flag应该是30位的,我们运行出的只有29位。最后一位要自己猜。

4.get flag

flag{ThisisthreadofwindowshahaIsESE}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `burn_drive_info` 和 `burn_drive_info_t` 实际上是同一个类型,都是用来表示刻录驱动器的信息的结构体。其中,`burn_drive_info` 是 `burn_drive_get_list` 函数的返回类型,而 `burn_drive_info_t` 是 `burn_drive_info` 结构体的定义。 当你调用 `burn_drive_get_list` 函数时,会返回一个 `burn_drive_info` 结构体数组,用于表示可用的刻录驱动器列表。这个结构体数组中的每个元素都是一个 `burn_drive_info_t` 类型的结构体,表示一个可用的刻录驱动器的信息。 因此,你需要在程序中包含 `<libburn/libburn.h>` 头文件,并使用 `burn_drive_info_t` 结构体来声明一个变量,以便在程序中访问 `burn_drive_info` 结构体数组中的每个元素的信息。例如: ```c #include <stdio.h> #include <libburn/libburn.h> int main() { burn_drive_info_t *drives = NULL; unsigned int count = 0; unsigned int i; /* 初始化 libburn 库 */ if (burn_initialize() != 0) { fprintf(stderr, "初始化 libburn 库失败\n"); return 1; } /* 获取可用的刻录设备列表 */ if (burn_drive_get_list(&drives, &count) != 0) { fprintf(stderr, "获取刻录设备列表失败\n"); return 1; } /* 打印刻录设备列表 */ printf("可用的刻录设备列表:\n"); for (i = 0; i < count; i++) { printf("%d. %s\n", i + 1, drives[i].devpath); } /* 释放刻录设备列表 */ burn_drive_release_list(drives); /* 关闭 libburn 库 */ burn_finish(); return 0; } ``` 在这个程序中,我们使用 `burn_drive_info_t` 来声明 `drives` 变量,以便在循环中访问 `burn_drive_info` 结构体数组中的每个元素的信息。 ### 回答2: burn_drive_info和burn_drive_info_t是两种不同的数据类型。 burn_drive_info是一个结构体类型,用于存储有关烧录驱动器的信息。它可能包含有关烧录驱动器的属性、状态、支持的烧录格式等各种数据。 而burn_drive_info_t可能是一个指针类型或变量类型,用于引用或保存burn_drive_info结构体的对象。当我们需要使用burn_drive_info结构体的实例时,可以声明一个burn_drive_info_t变量或指针,将其指向具体的burn_drive_info对象,以便访问和操作该对象的各个属性和方法。 因此,burn_drive_info可以看作是一个数据结构,而burn_drive_info_t是一个用于引用或保存该数据结构对象的类型。 总之,burn_drive_info是一个具体的结构体数据类型,用于存储烧录驱动器的信息,而burn_drive_info_t是一个类型,用于引用或保存burn_drive_info结构体对象。 ### 回答3: burn_drive_info指的是一个变量或对象的名称,表示烧录驱动器的信息。它可能用于存储关于烧录驱动器的各种属性和状态信息,例如驱动器名称、型号、序列号、烧录速度、可用容量等等。这个变量或对象可以用于在程序中操作烧录驱动器,获取驱动器的相关信息或执行烧录操作。 而burn_drive_info_t则表示一个类型或结构体。它是一个自定义的数据类型,用于封装和组织烧录驱动器的信息。这个类型可能包含多个成员变量,分别表示烧录驱动器的不同属性或状态。通过使用该类型,可以方便地创建、传递和操作烧录驱动器的信息。 简单来说,burn_drive_info是一个具体的变量或对象,而burn_drive_info_t是一个抽象的数据类型。burn_drive_info可以是指向burn_drive_info_t类型的指针,也可以是直接存储burn_drive_info_t类型的实例。 在程序中,可以使用burn_drive_info变量来引用和操作对应的burn_drive_info_t类型的实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值