第七届XCTF国际网络攻防联赛总决赛战队巡礼!
全部标签攻防世界pwn1题解下载附件,file命令识别文件为64位,checksec命令查看程序保护情况,如图,有Canary和NX保护。在ida64中打开程序,程序的主要功能有两个:存储用户输入的字符串内容打印用户输入的字符串内容特别的注意到,字符串数组大小为136(0x88),而read运行的最大输入大小为0x100,如图中红色框标注,因此可能存在栈溢出。同时puts可以将输入打出,因此可以想到借此泄露出canary值。在汇编程序40091C地址处,可以看到canary值保存在rbp上8字节处(即紧邻rbp)。GCC的canary,x86_64下从fs:0x28偏移处获取,32位下从gs:0x14
ReverseROP解析data的ROP,一点一点还原frompwnimport*opcode=open('data','rb').read()opcode_gadget=opcode[0x30+8:]foroffsetinrange(0,len(opcode_gadget),8):print(f'{hex(u64(opcode_gadget[offset:offset+8]))}') 提取出来密文,转成64位的cipher=[0x98,0x7A,0xDF,0x57,0xC6,0xE3,0x18,0xC7,0x11,0x07,0xC7,0xD4,0x02,0xD2,0x9E,0x43,0x3A
ReverseROP解析data的ROP,一点一点还原frompwnimport*opcode=open('data','rb').read()opcode_gadget=opcode[0x30+8:]foroffsetinrange(0,len(opcode_gadget),8):print(f'{hex(u64(opcode_gadget[offset:offset+8]))}') 提取出来密文,转成64位的cipher=[0x98,0x7A,0xDF,0x57,0xC6,0xE3,0x18,0xC7,0x11,0x07,0xC7,0xD4,0x02,0xD2,0x9E,0x43,0x3A
unsepingmethod=$method;$this->args=$args;} //魔法函数,该函数会在类的一个对象被删除时自动调用function__destruct(){if(in_array($this->method,array("ping"))){call_user_func_array(array($this,$this->method),$this->args);//回调函数,可以将把一个数组参数作为回调函数的参数call_user_func_array($fun,$arr);}}functionping($ip){exec($ip,$result);var_dump($r
unsepingmethod=$method;$this->args=$args;} //魔法函数,该函数会在类的一个对象被删除时自动调用function__destruct(){if(in_array($this->method,array("ping"))){call_user_func_array(array($this,$this->method),$this->args);//回调函数,可以将把一个数组参数作为回调函数的参数call_user_func_array($fun,$arr);}}functionping($ip){exec($ip,$result);var_dump($r
题面有一棵二叉树,根结点上有一个空字符串,每个点的左儿子上的字符串为其父亲结点的字符串尾部额外加一个左括号,右儿子则是在尾部加一个右括号。树中的每个叶子结点上的字符串都分别和每个由\(n\)对括号组成的合法括号序列一一对应。给定\(n\),求此时这棵树的最大匹配所含的边数。(对\(998244353\)取模)样例输入:9输出:10350题解题意就是说,一颗深度为\(2n+1\)的二叉树,从根节点开始向左子节点走相当于增加一个左括号,向右子节点走相当于增加一个右括号,先设这颗二叉树是满二叉树,然后不停地将所有不表示合法括号序列的叶子节点删掉,直到所有叶子节点都表示一个长度为\(2n\)的括号序列
题面有一棵二叉树,根结点上有一个空字符串,每个点的左儿子上的字符串为其父亲结点的字符串尾部额外加一个左括号,右儿子则是在尾部加一个右括号。树中的每个叶子结点上的字符串都分别和每个由\(n\)对括号组成的合法括号序列一一对应。给定\(n\),求此时这棵树的最大匹配所含的边数。(对\(998244353\)取模)样例输入:9输出:10350题解题意就是说,一颗深度为\(2n+1\)的二叉树,从根节点开始向左子节点走相当于增加一个左括号,向右子节点走相当于增加一个右括号,先设这颗二叉树是满二叉树,然后不停地将所有不表示合法括号序列的叶子节点删掉,直到所有叶子节点都表示一个长度为\(2n\)的括号序列
0x00:查看文件一个32位的文件,canary、NX、PIE保护机制均关闭。 0x01:用IDA进行静态分析程序很简单,输入一串字符(个数限制:512),然后再输出。最后根据key变量进行条件语句执行。在imagemagic函数中用printf(format)进行输出,大概率有格式化字符串漏洞。因为key的地址在bss段:0x0804A048,所以试试用格式化字符串漏洞进行覆盖。 检测一下是否可以对随意地址进行覆盖:有重复的,位于第12个参数。重复的原因是因为s是定义在了栈上。payload=p32(key_addr)+b'%035795742d'+b'%12$n'将key的地址写在第一位,
0x00:查看文件一个32位的文件,canary、NX、PIE保护机制均关闭。 0x01:用IDA进行静态分析程序很简单,输入一串字符(个数限制:512),然后再输出。最后根据key变量进行条件语句执行。在imagemagic函数中用printf(format)进行输出,大概率有格式化字符串漏洞。因为key的地址在bss段:0x0804A048,所以试试用格式化字符串漏洞进行覆盖。 检测一下是否可以对随意地址进行覆盖:有重复的,位于第12个参数。重复的原因是因为s是定义在了栈上。payload=p32(key_addr)+b'%035795742d'+b'%12$n'将key的地址写在第一位,
0x00:查看文件信息该文件是32位的,canary和PIE保护机制没开。 0x01:用IDA进行静态分析总览:该函数就是:v5初值为1,对v2输入一串字符。然后执行一个会根据输入的字符串而修改v5的循环语句,最后调用相应的函数。 同时,发现文件里面已经含有catflag的函数: 函数snprintf介绍:printf("cat%s","./flag")是将cat./flag输出到屏幕上。snprintf(s,0x32,"cat%s","./flag")是最多将后面的字符串("cat./flag")输入0x32个到变量s上。 所以,我们要想办法去执行这个cat_flag函数。现在我们已