11 2023 档案
摘要:查保护 然后ida看代码逻辑 来到关键函数,这里存在栈溢出漏洞,但是这是数组循环一个字节读入,我们看一下i的地址 发现i的地址在rbp上面,所以我们构造payload肯定会把i的值给覆盖了,所以payload在构造时需要修改一下i的值,让我们的payload继续读入到正确位置,然后就是简单的ret2
阅读全文
摘要:import requests import json from lxml import etree from concurrent.futures import ThreadPoolExecutor 导入多线程所需要的库 def mians(num): url=f"http://www.1o1o.
阅读全文
摘要:还是先查一下程序保护情况 然后看一下代码逻辑 可以发现这里的代码还是挺多的,这里讲一下几个关键部分,首先是开头的addr = (__int64)mmap(0LL, 0x1000uLL, 7, 34, -1, 0LL);将addr这个地址开始的地方变成rwx权限,我们看一下这个地址是哪里 发现addr
阅读全文
摘要:这道题没给附件,直接就是nc 这个题目的意思是,我们随机输入一个数,然后发给我们一段base64加密后的密文,真正num就在里面,我们现在写个pwntools脚本提取一下这段base64密文,解密一下,看看是什么东西 exp: io=remote("node4.anna.nssctf.cn",280
阅读全文
摘要:import requests from lxml import etree url="https://pic.netbian.com/4kdongman/" domain="https://pic.netbian.com/" data=requests.get(url) #print(data.t
阅读全文
摘要:看一下程序的保护状态 开了canary,接着看一下代码逻辑 可以发现,这里有格式化字符串漏洞,同时gets函数有栈溢出漏洞,现在只需要确定我们输入到buf的内容在格式化字符的第几个参数就行 可以确定buf在格式化字符串的第8个参数,又因为buf的偏移是0x20,所以canary在11个参数,因为ca
阅读全文
摘要:检查一下保护状态 接着ida看代码逻辑 看func函数 第一次看真没发现有什么漏洞,题目给了backdoor,虽然strlen可以\x00绕过,但是strcpy函数也限制漏洞的实现。仔细看的话,会发现v3的类型是 unsigned __int8 v3; 说明v3是一个字节来表示的,可表示的范围只有0
阅读全文
摘要:打开附件的流量包 可以发现有很多的tcp协议数据,追踪tcp协议数据看看 可以发现tcp数据流中有很多类似坐标的东西,先把这些数据另存为txt保存,如何用正则表达式提取这些数据,提取脚本如下: import re with open("data.txt", "r", encoding="utf-8"
阅读全文
摘要:附件下载下来有三个东西。 点开exe,发现是鸡哥 判断应该是.net程序(.NET 是一个免费的跨平台开源开发人员平台,用于生成许多不同类型的应用程序。 凭借 .NET,可以使用多种语言、编辑器和库来生成 Web、移动应用、桌面应用、游戏和 IoT 应用),可以用dnspy打开,那个exe和json
阅读全文
摘要:栈迁移的利用的过程不是很复杂,原理方面是比较麻烦:栈迁移原理介绍与应用 - Max1z - 博客园 (cnblogs.com) 这里简述一下栈迁移的利用过程: 我们先来看一下这道题的程序保护情况: 开了canary,接着看代码逻辑 这里的printf("Hello, %s\n", buf);可以发现
阅读全文
摘要:附件下载下来是一个流量包,用wireshark打开该流量包,然后搜索字符串"flag",就会出现如下的jsfuck代码 右键onlick显示分组字节 可以看到很大一串的jsfuck代码,现在是需要运行这段代码,可利用在线网站运行:JSFuck - 在线加解密 (bugku.com),运行完就是fla
阅读全文
摘要:直接用脚本: def shrinkBFCode(code): cPos2Vars = {} #位置对应的变量 cPos2Change = {} #位置中 + 号 增加的值 varPos = 0 nCode = [] incVal = 0 lc = None dataChangeOp = set(['
阅读全文
摘要:这道题是简单的libc,不过多分析了 exp: from pwn import * from LibcSearcher import * io=remote("node5.anna.nssctf.cn",28341) elf=ELF("./pwn") put_got=elf.got["puts"]
阅读全文
摘要:拿到程序先查一下保护状态 可以发现保护全开,再看一下程序的逻辑 可以发现,这里有一个fork函数: C语言中的fork()函数用于创建一个新的进程,该进程是原始进程(父进程)的一个副本。这个副本将从fork()函数之后的代码行开始执行,父进程和子进程在此处分别继续执行不同的代码。fork()函数的返
阅读全文
摘要:拿到程序,我们先查一下有没有加壳,发现没有加壳,并且是64位程序,拖进ida分析其代码逻辑 int __cdecl main(int argc, const char **argv, const char **envp){ void **v3; // rcx __int64 v4; // r8 si
阅读全文
摘要:查一下程序保护情况 发现是partial relro,说明got表是可以修改的,下一步看代码逻辑 看到这一段 puts(&seats[16 * v0]);存在数组越界的漏洞,因为上面的代码没有对v0进行负数的限制,v0可以是负数,我们来看一下seat的数据 可以发现seat上面的数据就是got表,s
阅读全文
摘要:查看程序保护 发现开了pie: partial write(部分写入)就是一种利用PIE技术缺陷的bypass技术。由于内存的页载入机制,PIE的随机化只能影响到单个内存页。通常来说,一个内存页大小为0x1000,这就意味着不管地址怎么变,某条指令的后12位,3个十六进制数的地址是始终不变的。因此通
阅读全文
摘要:查一下程序保护状态 保护全开,看一下代码逻辑 逻辑比较简单,就是输入一个用户名,然后进行随机数运算,这里可以使用ctypes模块,形成和服务器那边一模一样的随机数 from pwn import * import ctypes context(os='linux',arch='amd64',log_
阅读全文
摘要:先查看程序的保护状态 可以看到,保护全开,拖进ida看主函数的逻辑 可以看到有个mmap函数: mmap() 函数是Unix和类Unix操作系统中的一个系统调用,用于在进程的地址空间中映射文件或者其它对象。这样做的好处是可以让文件直接映射到内存中,从而避免了频繁的文件 I/O 操作,提高了文件的读取
阅读全文
摘要:下载附件,解压出来是一个txt 打开这个txt看一下 根据前面pk,可以判断这应该是一个压缩包文件,导入hxd,发现文件头是zip的文件头,直接重命名,后最加上zip就行,然后用打开这个zip 里面没有加密的hint.txt,打开该txt 接下来就是漫长的解密过程,可以用千千秀字网站继续解密:导航菜
阅读全文
摘要:附件下载下来,解压,发现是一个python打包的exe 这里用pyinstxtractor进行反编译,后面会得到一个文件夹,里面有一个pyc文件 这里可以用进行网站进行对pyc进行反编译:在线Python pyc文件编译与反编译 (lddgo.net) 反编译的python结果如下: # Visit
阅读全文
摘要:查看附件内容 这道题的逻辑就是可以让你输入1或者2,进入各自的函数去执行功能 func函数: def func(): code = input(">") if(len(code)>9): return print("you're hacker!") try: print(eval(code)) ex
阅读全文
摘要:查看附件,这次有点不太一样,这次是python2的环境 只有一个input函数,但是python2的input函数可是不太一样: 在python2中,input函数从标准输入接收输入,并且自动eval求值,返回求出来的值在python2中,raw_input函数从标准输入接收输入,并返回输入字符串在
阅读全文
摘要:查看附件内容 这道题过滤挺多重要的函数,比如exec,input,eval,还对长度做了限制,这里了尝试了help函数,但是最后一步!ls没通,接着考虑breakpoin函数: Python中内置了一个名为breakpoint()的函数,在Python 3.7中引入,用于在调试模式下设置断点。使用b
阅读全文
摘要:还是先看附件内容 这里对字符串长度进行了进一步的限制,长度不能大于7,这里可以输入help(),help函数: help() 函数是 Python 的一个内置函数,用于获取关于模块、函数、类、方法等的帮助信息。当你在交互式命令行中使用 help() 函数时,它会打开一个交互式帮助系统,让你能够浏览相
阅读全文
摘要:查看题目附件 这个if语句直接限制了输入的字符串长度不能大于13,像__import__('os').system('sh')现在肯定用不了,但是可以输入eval(input())进行嵌套执行,这句代码的意思相当于input()继续输入字符串,再由eval函数解析执行,所有就没有了字符长度的限制,为
阅读全文
摘要:查看附件 可以看到,这次过滤挺多重要的字符,比如\,'等字符,还过滤的字母i和b,这道题可通过python模板注入:(ssti注入) # 下面是渐变过程().__class__.__base__.__subclasses__() getattr(().__class__, '__base__')._
阅读全文
摘要:这是一道python沙盒逃逸的题目: 沙箱逃逸:就是在给我们的一个代码执行环境下,脱离种种过滤和限制,最终成功拿到shell权限的过程,其实就是闯过重重黑名单,最终拿到系统命令执行权限的过程,这里不理解没关系,多做两道题就知道了,老实说国内的沙箱逃逸的题不是很多,而且大多都是面向新手的?对我来说正好
阅读全文
摘要:这次是想爬取一个壁纸网站里面图片的url,这里使用了lxml库,先上脚本 import requests from lxml import etree url="https://pic.netbian.com/4kdongman/" domain="https://pic.netbian.com/"
阅读全文
摘要:这道题的附件是一个pyc文件,需要 可通过在线网站反编译成py文件 在线Python pyc文件编译与反编译 (lddgo.net) 代码逻辑很简单,就是我们读入的东西先base58再base64,最后等于M0hBajFITHVLcWV6R1BOcEM5MTR0R0J3eGZVODV6MTJjZUh
阅读全文
摘要:首先checksec 没开nx,说明堆栈可执行,初步考虑需要shellcode,然后拖进ida看主函数逻辑 看chall函数 printf("Yippie, lets crash: %p\n", s)这里泄露的s的地址,即栈上的地址 这里的输入的s数组是不存在栈溢出的,这里的关键代码是这一段 res
阅读全文
摘要:这是ctfshow上面的一道题 这边v1和v2定义时都是int,有符号整数,想让v1-v2=9,可以考虑负数,但是这个函数过滤了负号 if ( strchr(s, 45) ) return 0LL; 可以考虑输入比较大的数有符号溢出成负数, 输入4294967295的话,就会解析成-1,然后8-(-
阅读全文
摘要:先贴上爬取的脚本: import requests import re for i in range(1,11): num=(i-1)*25 url=f"https://movie.douban.com/top250?start={num}&filter=" head={"User-Agent":"
阅读全文
摘要:附件下载下来是一张图片 各种隐写工具一把梭,无果,分析其二进制数据,把图片拖进hxd,发现一段疑似base64的东西 base64解密试试 解密出来是一个网址,打开下载第二个附件:flag.zip,打开这个附件 发现需要密码,里面还有个密码的文件夹,打开密码那个文件夹, 9个加密的txt文件,但是里
阅读全文
摘要:这道题挺好的,可以帮助我更好的理解gadget的利用以及rop技术 首先,查一下程序保护情况 拖进ida分析 这里sys_read和sys_write是系统调用函数,看汇编可以分析出来 我们首先要了解一下64位系统的系统调用 传参方式:首先将系统调用号 传入 rax,然后将参数 从左到右 依次存入
阅读全文
摘要:附件下载,查壳 发现是ELF程序,64位,ida打开分析 flag函数点进去 前面一堆代码其实都不重要,直接看主要代码: puts("The length of flag is 13"); srand(seed); printf("NSSCTF{"); for ( m = 0; m < 13; ++
阅读全文