随笔分类 -  CTF writeup

摘要:看下程序的逻辑: 输入16个字符,对每个字符加以判断(与v2数组的各个元素比较),判断通过则输出shaktictf{字符串} 使用ida-python,去还原这个字符串,脚本如下: #v2的地址是0x201020 ans="" for addr in range(0x201020+3*4,0x201 阅读全文
posted @ 2021-04-05 21:29 田埂 阅读(238) 评论(0) 推荐(0)
摘要:检查下保护机制: 没有canary ida看下逻辑: 采用alloca在栈上申请一块空间,我们可以传入1,这样申请的就是0x10,下面可以写0x78个字节,导致栈溢出 本来我想传入0的,这样就有更多的空间却写rop,但是没得办法,传0它还是申请0x10的空间 这里有许多的gadget,写题的时候没有 阅读全文
posted @ 2021-04-05 16:17 田埂 阅读(314) 评论(0) 推荐(0)
摘要:用ida打开文件,hex view页面下看到,有两个.PNG........IHDR 用notepad把第一个.PNG给删掉,然后保存 阅读全文
posted @ 2021-04-05 14:17 田埂 阅读(93) 评论(0) 推荐(0)
摘要:这道题是维吉尼亚加密,密文是:ovmogeqfj{yahe_wgwff_avpv_eszahtmac_qxefowoey!},这里可以在线解密,即使不知道key:https://www.boxentriq.com/code-breaking/vigenere-cipher 阅读全文
posted @ 2021-04-05 14:16 田埂 阅读(111) 评论(0) 推荐(0)
摘要:检查下保护机制: 64位的程序,没有开启什么保护,这样就可以写shellcode ida看下逻辑: _start调用vuln函数,然后exit,那我们看下vuln: sub rsp 0x20,说明栈帧大小只有0x20 但是接下来的read,却可以读取0x200个字节,这就造成了栈溢出 这是一个汇编写 阅读全文
posted @ 2021-03-27 20:19 田埂 阅读(134) 评论(0) 推荐(0)
摘要:ida看下程序逻辑: 这是一道格式化字符串的题,并且给了栈址和pie基址 我以为我可以秒它,直到我发现脚本越写越多 思路就是在返回地址写rop,注意一定要加ret,因为远程的环境可能是ubuntu 20 先写rop拿libc地址,然后再写rop拿shell 要注意的问题是,写好自动判断各个地址前四位 阅读全文
posted @ 2021-03-27 19:44 田埂 阅读(167) 评论(0) 推荐(0)
摘要:看名字应该是道堆题,ida分析一下,主函数是这样的: 主要功能就是encrypt,和decrypt 那看下encrypt函数: 就是申请一个堆块然后写数据,再把数据和输入的key值异或一下存储在堆块上 再分析下decrypt函数: 会把堆块的内容逐个与key异或后,打印出来,也就是说具有show的功 阅读全文
posted @ 2021-03-27 14:13 田埂 阅读(154) 评论(0) 推荐(0)
摘要:检查下保护机制: 32位程序,没有开启canary ida逆向看一下情况: 去除了符号表,从参数可以看出sub_8049010是setvbuf(),也可以gdb调试验证那就不去管它,直接看myFun,但是ida报错,没办法反编译: 它说在0x80493A1分析失败,那看下0x804931到底调用了哪 阅读全文
posted @ 2021-03-24 23:06 田埂 阅读(131) 评论(0) 推荐(0)
摘要:检查下保护机制: 看下程序逻辑: 逻辑相对明确,增删改查,增改放在一块 看下alloc函数,这不是库函数,是一个自己定义的函数 看下delete函数: 没有置空指针,造成uaf,可以用来拿libc地址 然后libc-2.23下的double free 拿malloc_hook就可以了 注意one_g 阅读全文
posted @ 2021-03-22 10:32 田埂 阅读(167) 评论(0) 推荐(0)
摘要:检查一下开启的保护机制: 用ida分析一下程序: 主函数是这样的: 走到construct_animal()函数: 申请了一个堆块,用以存储动物结构体,看起来这个堆块上有函数指针 并且会把anmial->name初始化为0x24个空格,下面change_name时会用到 main函数调用完const 阅读全文
posted @ 2021-03-09 08:17 田埂 阅读(141) 评论(0) 推荐(0)
摘要:打开题目链接,显示的页面是这样的: 提示说需要以admin身份登录,那用burp suite抓包看一下: 我们修改cookie值,把tm_admin设置为1,tm_user设置为admin的md5值,这样发送过去就拿到了flag: 阅读全文
posted @ 2021-03-09 08:16 田埂 阅读(102) 评论(0) 推荐(0)
摘要:题目提供了elf文件和libc库,以及源代码,源码如下: #include <iostream> #include <vector> template<typename T> class safe_vector: public std::vector<T> { public: void wipe() 阅读全文
posted @ 2021-03-07 23:31 田埂 阅读(253) 评论(0) 推荐(0)
摘要:题目提供了elf文件和源码 源码是这样的: global _start section .text %macro call 1 ;; __stack_shadow[__stack_depth++] = return_address; mov ecx, [__stack_depth] mov qwor 阅读全文
posted @ 2021-03-07 23:29 田埂 阅读(195) 评论(0) 推荐(0)
摘要:检查一下保护机制: 只有pie没有开 ida看下程序逻辑: main函数: 第13行获取一个数字,第14行malloc(8*num)申请一个堆块,这个堆块将被用于保存其它堆块的堆址 然后进入while循环,首先是sub_4011c6函数: 会把数组off_404020里的字符指针指向的字符串依次打印 阅读全文
posted @ 2021-02-08 15:00 田埂 阅读(250) 评论(0) 推荐(0)
摘要:检查一下保护机制: 没有开启canary和pie,栈溢出少了很多麻烦 ida看下程序逻辑: gets函数导致栈溢出,可惜只有write函数作为输出, 本地可以写常用的rop,调用write函数泄露地址,但是远程的rdx好像为0,因此采用ret2csu的办法去泄露地址,拿到地址后接着写rop,执行sy 阅读全文
posted @ 2021-02-08 14:59 田埂 阅读(172) 评论(0) 推荐(0)
摘要:64位程序,函数的前六个参数存储在 rdi、rsi、rdx、rcx、r8、r9,其余的参数放在栈上 在ret2libc的时候,需要知道libc的基址,然后才能知道具体的库函数地址 那么首要的问题就是泄露出libc基址,如果有puts、printf函数还好说,倘若给一个write函数,那么泄露地址就成 阅读全文
posted @ 2021-02-07 22:27 田埂 阅读(840) 评论(0) 推荐(2)