[NewStarCTF 2023 公开赛道]shell code revenge
特殊shellcode https://buuoj.cn/challenges#[NewStarCTF%202023%20%E5%85%AC%E5%BC%80%E8%B5%9B%E9%81%93]shellcode%20revenge 这道题有点像我之前做过的mrctf的shellcode的revenge。不过范围不一样。 大概看一下,把所有的大写字母和数字都排除在外了,意思是只要输入大写字母和数字就不会被break——跳出。 所以我们要创造一个只有大写字母和数字的shellcode? 然后我也懒得checksec了,而且用的是rsp——也就是64位。开了一些保护啥的,反正jumpout到的66660000h这个地址在上面的mmap里面写入了权限’7’(第三参数),也就是可读可写可执行。 整个代码的逻辑是:出现Show me your magic之后,进入一个for循环,for循环一开始会有一个read让我们输入数据,因为是一个char类型指针buf,每次读取一个值。然后下面的strncpy()会把我们一个一个输入的buf存到src里面的src复制到我们的0x6666000...
ciscn_2019_s_9
Shellcode 栈溢出 https://buuoj.cn/challenges#ciscn_2019_s_9 首先checksec一下,看一下大概内容: IDA打开之后,发现有一个后门函数hint,逻辑如下: 使用此函数的时候,执行esp里面的内容(使用了jmp),我们不需要这些上面什么乱七八糟的东西,我们只需要.text里面的0x08048554的jmp esp就行了。先记下来这是我们可以利用的漏洞。 然后这里是程序唯一一个输入口,也就是说大概率这里有漏洞: 他首先可以让我输入32h的内容,不过通过伪C代码(其实汇编也能看到),这个字符串的长度只有24。也就是说可以构造栈溢出,这个就很简单了。那么我现在构造含有shellcode这样的一个payload: 所以说,大概代码如下: 12345678910111213141516171819202122from pwn import*context(log_level = 'debug', arch = 'i386', os = 'linux')p = re...
mrctf2020_shellcode
类型:pwn、shellcode https://buuoj.cn/challenges#mrctf2020_shellcode 首先检查文件 大概了解情况之后,根据题目标题,我大概知道是shellcode,然后打开IDA查看一下代码长啥样。 一整个流程是这样的,然后F5也没有办法正常反编译成伪C。 整个使用流程大概如此。 再回到汇编,在输出之后可以让我读取值。因为call了read函数 123456#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);//其中,fd是文件描述符//buf是指向数据将被读取的缓冲区的指针//而count是期望读取的字节数//当调用read函数时,它会尝试从fd指向的文件中读取count个字节的数据到buf所指向的内存中。如果读取成功,函数返回实际读取到的字节数;如果读取到文件末尾或没有可读取的数据,函数返回0;如果发生错误,则返回-1,并将错误代码存入errno中。 这边题目给了不少备注,在程序的一开始用了一个buf什么-410h,这个就是rb...
mrctf2020_shellcode_revenge
类型:shellcode 字符审查 https://buuoj.cn/challenges#mrctf2020_shellcode 一如既往的checksec 打开ida之后我们发现图形化反汇编mian函数里面有很多的跳转。我们直接F5,会报错,说call rax这一行有问题。我们直接右键未定义即可。 看起来是一堆if字符检测,我们拿出离散数学的知识和ASCII码表对照一看就会快速发现这是一个把所有的非字母、非数字常规文本字符给去掉了。只有“qwertyuiopasdfghjklzxcvbnm QWERTYUIOPASDFGHJKLZXCV BNM 1234567890”这些字符。 然后原理和mrctf2020_shellcode一样,读入什么执行什么。 我们可以用alpha3工具来帮我们生成这个shellcode:alpha3.py ok了,然后我们就得到64位的shellcode字符串化的串为: 1Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2O2u2E0Z7m0n7m0R0b2x2o0Y102...
pwnable_orw【有问题】
Shellcode、ORW https://buuoj.cn/challenges#pwnable_orw 首先checksec 32位系统下,栈可执行,有金丝雀。看一下代码: 代码相当简单,有一个seccomp的初始化,然后read了一个shellcode(字符串),然后以shellcode字符串的地址直接在栈上执行。根据题目叫做pwn able orw,也就是一道考察ORW syscall的题目。 查看一下seccomp启用呢? 启用了open、read、write和exit,还有一个什么sigreturn和rt_sigreturn,和一个架构。 之前写过类似的题目,详细记录在这:shellcode1_dahuan02 不过这个是32位系统的,我们按照32位做一个ORWshellcode就可以了 1234567891011121314151617181920212223242526272829303132333435from pwn import *# r = process("./orw")r = process('./orw...
jarvisoj_level1
ROP-ret2syscall,栈溢出 https://buuoj.cn/challenges#jarvisoj_level2_x64 checksec 保护全关,32位系统。其中一开始会输出buf的地址 这个逻辑很简单,我先输入shellcode,然后栈溢出,返回到栈上的buf地址运行即可。 exp: 12345678910111213141516171819from pwn import *context(log_level = 'debug', arch = 'i386', os = 'linux')ip='ip_addr'port=1111file_addr = './jarvisoj_level1'# p = remote(ip,port)p = process(file_addr)elf = ELF(file_addr)buf_addr = int(p.recvline()[len("What's this:")+2:-2],16...
jarvisoj_level2
ROP-ret2text,栈溢出 https://buuoj.cn/challenges#jarvisoj_level2 首先checksec一下: 32位,有栈堆不可执行。 main函数调用了system函数,说明我们可以知道system函数的地址,找一下: system_addr = 0x08048320 再看一下main函数中调用的另外一个函数vulnerable_function() 非常明显的栈溢出。 回忆一下栈帧结构: 在这里,我们首先溢出覆盖vulnerable_function()函数的返回地址,将返回地址修改成system函数,然后再往system函数里面塞入参数“/bin/sh”即可。 在system函数的栈帧结构是这样的:command参数在返回地址的上面,所以我们的payload的构造思路是这样的: 然后还需要一个参数“/bin/sh”,非常好的是我们不需要自己构造了,在Strings视图里面找到了一个存有此参数的地址,我们直接把这个地址塞进去即可。0x0804A024 exp: 12345678...
jarvisoj_level2_64
ROP-ret2text,栈溢出 https://buuoj.cn/challenges#jarvisoj_level2_x64 是jarvisoj_level2的64版本。 按照32位的思路,我们找一下system函数和“/bin/sh”即可。 system_addr = 0x00000000004004C0 binsh_str_addr = 0x0000000000600A90 这边的buf栈帧变为128了,需要改一下。其他32位中所有的占4字节的都变成8字节例如saved registers。 然后,在64位里面,所谓的“形式参数”不再是存储在栈中而是存储在了rdi里面。如图中鼠标指出的所示(因为byd每次截图都截不到只能用手机拍了) 所以我们要把0x0000000000600A90传递给rdi才行。 通过ropper很轻松就能找到这行数据。并且后面还有一个ret我们刚好可以用到。 其payload构造思路也变成了: 整个流程就是:先调用pop rdi,在rdi里面塞入/bin/sh的值,随后需要一个ret地址,塞入s...
easy-shellcode
类型:shellcode、栈溢出 https://www.qsnctf.com/ 题目叫做:Easy_Shellcode 输入然后栈中执行,一开始的时候会输出v4的地址。 PIE每次会随机地址,但是按照人类逻辑的最前面三位不动。通过0x7ff将后面的值全部获取。再return到这里执行shellcode即可。 exp: 123456789101112131415161718192021222324from pwn import *context(log_level = 'debug', arch = 'amd64', os = 'linux')ip='challenge.qsnctf.com'port=34976file_addr = './easy-shellcode'p = remote(ip,port)# p = process(file_addr)elf = ELF(file_addr)v4_addr=int(p.recvline()[2:],16)print(...
overflow_ez_32
首先checksec: 保护全关,一般保护全关的题目要么特别简单要么特别难。很显然(因为这是我自己做的题),这个是前者。(当然不是所有带有ez的题目都很ez)(但是这个是真ez) 直接拖到ida一探究竟。 有一个main函数和一个back_door,还有一个overflow和init函数,backdoor里面是一个超级大后门: main函数里面是init和overflow,一个是初始化,还有一个是一个最简单的栈溢出: 如图可见,这里有一个不安全的gets函数,然后有一个s变量。 点进去之后我们就能发现,从-0x18到+0x04都是本栈帧的模样,然后要输入0x18个字节覆盖char字符串s和一个var_4,输入4个字节覆盖saved register,最后输入4字节的地址来覆盖return地址。 所需要的地址就是我们的backdoor函数地址… backdoor的位置在0x080491F0这个位置上,当然我们也可以填入0x08049211这个地址,这样可以跳过上面那个puts函数的调用。不过这里没必要,我们就以backdoor的地址为需要进入的地址: exp: 1234...

![[NewStarCTF 2023 公开赛道]shell code revenge](/img/bocchi/bocchi0x0003.gif)








