BUUCTF——[WUSTCTF2020]level4

文章讲述了作者在解决编程挑战时,误打误撞地探索了一段代码,最终发现题目实际考察的是二叉树的中序和后序遍历。通过理解这两种遍历方式,结合参考代码,使用递归实现了前序遍历找到隐藏的flagwctf2020。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 先运行一遍,我猜测就是对I{_}Af2700ih_secTS2Et_wr这一行代码进行正确的排序就寻找到正确的flag了,第一二种都不对,我猜测是第三种。

分析伪代码:

进入init函数里面

 调试至第34行时,从头至尾点开qword_xxx,会看到flag。

以上是我的思路,但是看到大佬写的wp才知道考得是数据结构中的二叉树的遍历

其中type1和type2分别是中序遍历和后序遍历。

参考代码:已知中序后序求前序,然后改一下代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char post[] = "20f0Th{2tsIS_icArE}e7__w"; //后序遍历结果
char mid[] = "2f0t02T{hcsiI_SwA__r7Ee}"; //中序遍历结果

void pre(int root,int start,int end)
{
    if(start > end)
        return ;
    int i = start;
    while(i < end && mid[i] != post[root])
        i++;   //定位根在中序的位置
    printf("%c",mid[i]);
    pre(root - 1-(end - i),start,i - 1);  //递归处理左子树
    pre(root-1,i + 1,end);  //递归处理右子树
}

int main()
{

    pre(24,0,24);//24为flag的位数
    return 0;
}

即可求出wctf2020{This_IS_A_7reE}

### BUUCTF Level 4 解题思路 对于BUUCTF level 4,题目通常涉及二进制漏洞利用技术。具体到此关卡,主要考察的是通过格式化字符串漏洞来实现任意地址读取以及最终获取flag。 #### 题目分析 程序可能存在未正确处理用户输入的情况,特别是当涉及到格式化字符串时。如果程序将用户的输入直接作为格式化字符串参数传递给`printf()`或其他类似的函数,则可以利用这一特性来进行攻击[^3]。 #### 利用方法 为了完成这道挑战,需要构造特定的payload以触发格式化字符串漏洞并泄漏栈上的数据或库函数地址。一旦获得了这些信息,就可以进一步计算出系统调用所需的偏移量,从而控制执行流程达到提权的目的。 #### Python Exploit 脚本示例 下面是一个简单的pwn工具包(Pwntools)脚本来展示如何连接服务器发送恶意负载: ```python from pwn import * # 设置目标IP和端口 target_ip = 'node4.buuoj.cn' port_num = 26465 # 创建远程连接对象 conn = remote(target_ip, port_num) # 构造Payload offset_to_return_address = 0x88 # 假设返回地址位于缓冲区之后88字节处 fake_ret_addr = 0xdeadbeef # 占位符用于覆盖原返回地址 payload = b'a'* offset_to_return_address + p64(fake_ret_addr) # 发送Payload至服务端 conn.sendlineafter(b'> ', payload) # 开启交互模式以便手动操作 conn.interactive() ``` 请注意上述代码仅为模板,在实际环境中需根据具体情况调整变量值如`offset_to_return_address`, `fake_ret_addr`等,并且可能还需要加入更多逻辑来解析响应消息、定位所需的信息(比如libc版本),进而构建更复杂的exploit chain。 #### 获取Flag 成功运行以上脚本并与服务端建立稳定通信后,按照提示逐步探索直至找到隐藏于内存深处的目标字符串——即为本次CTF竞赛所求之flag。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值