[BUUCTF]PWN——picoctf_2018_rop chain】的更多相关文章

picoctf_2018_rop chain 附件 步骤: 例行检查,32位,开启了NX保护 试运行一下程序,看到输入太长数据会崩溃 32位ida载入,习惯性的检索程序里的字符串,看见了flag.txt,双击跟进 看到程序将flag读入到了参数s里面,满足条件win1&&win2 &&a1==-59039827的条件,就能读出flag 从main函数开始看程序 vuln()函数 gets函数输入,没有限制读入长度,存在溢出漏洞,覆盖ret为flag函数地址,之后想办法去满足…
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个视频,我也刚接触堆不久,有些地方我也讲不清楚 ida载入,先看一下main函数,做堆题的时候需要将程序给理清楚了,这边的几个选项函数一开始不是如图所示的,我们可以右击给他重新命名一下,为了让我们看的更清楚 add,就是简单的创建一个chunk 在创建堆时有一个结构体,这个结构体大概是这样的: str…
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 25677 [注] nc命令详解 -c shell命令为"-e":使用/bin/sh来执行 [危险] -e 文件名程序在连接后执行 [危险] -b 允许广播 -g 网关源路由跃点,最多8个 -G num源路由指针:4,8,12... -i secs 发送的线路和扫描的端口的延迟间隔为1秒 -…
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的字符串,发现了/bin/sh,ctrl+x,跟进找到了后面函数,shell_addr=0x8048945 堆的main函数很简单,逻辑很简单,也没什么好说的,直接看菜单的各个选项 add,可以发现创建了两个chunk,第一个chunk是默认的,存放puts函数,我们可以控制第二个chunk add(…
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda计算偏移为23,写脚本 from pwn import* sh=remote('f.buuoj.cn',6001) payload='a'*23+p64(0x401186) sh.sendline(payload) sh.interactive() 得到flag 3,warmup_csaw_2016…
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到804871F函数中有个ctrncmp函数,输入的buf与一个随机数进行比较.可以通过输入开头的字符为'\x00'进行绕过,使strlen长度为0,则strncmp判定必定成功. 之后的漏洞函数中,a1是我们之前输入的第八个字符,如果我们输入\xff时,则在read时a1会进行符号填充,那么我们就可…
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn import * #context.update(arch = 'i386', os = 'linux', timeout = 1) p = remote('node3.buuoj.cn',27146) #p = process('./pwn1') flag_addr = 0x40118A paylo…
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方便理解 delete() show() 利用思路:使用uaf泄露libc,计算system,执行system('/bin/sh')获取shell 泄露libc print_note的打印功能可以帮助泄露地址. 先add chunk0,add chunk1,大小都为0x80. add(0x80,'aa…
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想到了SROP,之前遇到过一次,关于原理可以看一下这两篇文章 https://www.freebuf.com/articles/network/87447.html https://ctf-wiki.org/pwn/linux/stackoverflow/advanced-rop/srop/?h=+s…
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shell check() 很简单的检查,就是判断一下v5是否等于n0t_r3@11y_f1@g 看main函数可以知道,v5一开始是ju3t_@_f@k3_f1@g,之后没有对v5的操作了,然后让我们输入v4,看一下v4和v5在栈上的位置,发现v5就在v4下方不远处 v4的输入是用的gets函数,我们可以…
0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show() 利用思路 edit存在堆溢出,可以通过重叠堆来泄露libc 然后利用fastbin attack,修改malloc_hook为one_gadget 利用过程 首先来构造重叠堆 先申请3个chunk, add(0x10)#0 add(0x10)#1 add(0x80)#2 来看一下堆的布局 2.…
ciscn_2019_s_4 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下,看看大概的情况,两次输入,让人联想到栈迁移 32位ida载入,找到关键函数,只可以溢出8字节,没法构造太长的rop, 程序最后是用leave和retn还原现场的,首先想到的就是栈迁移 leave实质 上是move esp,ebp和pop ebp,将栈底地址赋给栈顶,然后在重新设置栈底地址,我的理解是重新开栈 retn实质上是pop rip,设置下一条执行指令的地址 利用思路 利用第一个输入点来泄露e…
hitcontraining_heapcreator 附件 步骤: 例行检查,64位程序,开启了canary和nx 本地试运行一下,看看大概的情况,经典的堆的菜单 64位ida载入,main函数没有什么看头,直接看各个功能函数 create(),一次请求申请了两个chunk,前一个chunk里记录着后一个chunk的指针和size edit() show() delete() 利用思路: 利用 off by one 漏洞覆盖下一个 chunk 的 size 字段,从而构造伪造的 chunk 大小…
mrctf2020_shellcode 附件 步骤: 例行检查,64位程序,开启了relro和pie,没有nx,肯定是用shellcode最方便了 本地试运行一下,看看大概的情况 64位ida载入,根据运行时看到的字符串,迅速定位到关键程序,但是没法f5成伪代码,直接看汇编 栈大小是0x410,读入了0x400,无法造成溢出覆盖返回地址 不过好像这边分析了用处也不大,直接利用pwntools生成shellcode发送即可 shellcode=asm(shellcraft.sh()) exp fr…
hitcontraining_magicheap 附件 步骤: 例行检查,64位程序,开启了nx和canary 本地试运行一下,经典的堆的菜单 64位ida载入,检索程序里的字符串的时候发现了后门 main() 可以看到,当v5=4=4869,而且magic在bss段,只要覆写magic>0x1305就能够获取到shell create_heap() edit_heap() delete_heap() 利用思路:首先通过 unsorted bin attack 覆盖 magic>0x1305,…
ciscn_2019_n_3 附件 步骤 例行检查,32位,开启了nx和canary保护 本地试运行一下,经典的堆题的菜单 3.32位ida载入 new(),申请了两个chunk,第一个chunk(13行)固定大小0xC,存放的是rec_int_print和rec_int_free函数的地址,第二个chunk(32行),是我们申请的chunk del() 如果值是整数,直接 free chunk 如果值是字符串,则 chunk 和存储字符串的 chunk 都要 free.注意这里只是进行了 fr…
[V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个chunk,delete只能执行3次 add() add函数只能创建一个chunk,不能读入数据,读入数据需要用到edit函数 edit() show() delete() 这题的libc是2.27,在libc2.26之后的libc版本中加入了新的存储结构tcache,这使得我们利用堆的时候要特别注意libc版…
babyfengshui_33c3_2016 附件 步骤: 例行检查,32位程序,开启了cannary和nx 本地运行一下看看大概的情况,熟悉的堆的菜单布局 32位ida载入,看main函数 add update delete display 先随便申请几个堆,看一下布局 add(0x80, 'name1', 0x80, 'aaa') add(0x80, 'name2', 0x80, 'bbb') add(0x80, 'name3', 0x80, 'ccc') gdb.attach(p) 和我们…
roarctf_2019_easy_pwn 附件 步骤: 例行检查,64位程序,保护全开 试运行一下程序,看看大概的情况,经典的堆块的菜单 64位ida载入,改了一下各个选项的函数名,方便看程序(按N) add edit free show 这道题的思路是通过 offbyone来构造重叠chunk,达到任意地址分配chunk的效果,然后修改malloc_hook地址处的内容为one gadget地址 首先利用Unsorted bin泄露libc的地址 我们先申请4个chunk add(0x18)…
[ZJCTF 2019]EasyHeap 附件 步骤: 例行检查,64位程序 试运行一下看看程序大概执行的情况,经典的堆块的菜单 64位ida载入,首先检索字符串,发现了读出flag的函数 看一下每个选项的函数 add 这边size的大小由我们输入控制,heaparray数组在bss段上存放着我们chunk的指针 edit,简单的根据指针修改对应chunk里的值,但是这里的size也是由我们手动输入的,也就是说只要我们这边输入的size比add的时候输入的size大就会造成溢出 delete,释…
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以申请一个0~111大小的堆块,note_list里存放的是chunk的指针,size_list里存放的是chunk的size edit edit_1,可以看到当i在出了第6行的if循环的时候,它的值是a2+1,这样导致存在off by one漏洞,应该将判断条件改写成>=10 show,根据传入的idx…
[BJDCTF 2nd]ydsneedgirlfriend2 附件 步骤: 例行检查,64位程序,开启了canary和nx 试运行一下程序,看看大概的情况,经典的堆块的布局 64位ida载入,习惯性的检索程序里的字符串,发现了后门函数,shell_addr=0x400D86 4.找一下4个菜单选项的函数 add dele dele函数存在明显的UAF漏洞,关于UAF漏洞,具体的看这篇文章 https://my.oschina.net/u/4345478/blog/4656767 show 我们首…
[BJDCTF 2nd]secret 附件 步骤: 例行检查,64位程序,开启了canary和nx 本地试运行一下,看看程序大概的情况,好像是一个什么游戏 64位ida载入,检索程序里的字符串,发现了flag字样 双击,ctrl+x找到了函数 sub_46A3F(),游戏开始界面,让我们输入名字 sub_40136D()函数太长了,没法f5 看汇编,看到首先调用了sub_46A329函数,在sub_46A329里读入了一个数据,off_46D090-1,然后跟标记处的数据比较,如果正确的话,就跳…
pwnable_start 附件 步骤: 例行检查,32位程序,什么保护都没开,首先想到的是ret2shellcode的方法 本地试运行一下,看看程序大概的情况 32位ida载入,没法f5,好在汇编不长,看得懂 一开始调用write函数输出了let's start the ctf,4是write函数的调用号,之后的调用号是3,调用了read函数,我们知道dl这个寄存器是控制输入字符的多少的,也就是所我们可以输入0x3c个字符,也就是执行了 write(1,buf,0x14) read (0,bu…
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函数,沙盒的限制条件 用seccomp-tools看一下 其他禁用的指令是干什么的我不是很清楚,但是禁用了execve(系统调用),也就没办法获取shell权限了,只能够想办法通过open–>read–>write的方式来获取flag的值了 sub_1347()函数 一开始给我们泄露了puts函数的…
inndy_rop 附件 步骤: 例行检查,32位,开启了nx保护 本地调试运行没看出个啥,直接上ida,一开始f5会报错, 找到报错提示的位置,点击option–>general调出如图的界面,勾选上stack pointar 看到堆栈不平衡,选中报错地址的上一行,右击,点击"change stack"跳出如图界面,在sp值前加个"–"即可 然后就能f5反编译了,main里就一个overflow函数,存在溢出漏洞 右边的函数列表里只有静态编译的结果,所以这题…
axb_2019_fmt32 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入 alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程.如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程 25行,明显的格式化字符串漏洞 这题没有后门函数,也没有系统函数,要用格式化字符串泄露出某个libc函数,来获得libc基址 s 和 format 两个参…
others_babystack 附件 步骤: 例行检查,64位程序,开了挺多保护 本地试运行一下程序 64位ida载入,看main函数 1是read函数,存在栈溢出:2是puts函数,3退出 利用思路 泄露canary 由于存在canary,我们首先要想办法泄露出它的值来绕过canary保护,puts函数在输出的时候是遇到'\x00' 才会结束,我们都知道canary跟在ebp之后,因此我们直接填充'a'到ebp,正好 可以把canary的截断符覆盖,再输出,就会连canary输出来了,成功泄…
gyctf_2020_borrowstack 附件 步骤: 例行检查,64位程序,开启NX保护 本地运行一下程序,看看大概的情况 64位ida载入,直接从main函数开始看程序, buf可以溢出0x10字节,只能够覆盖到ret,参数bank在bss段上,所以打算在buf处利用leave指令去劫持栈,让它跳转去bank处,往bank里写入我们的ret2libc的攻击链去获取shell 随便找个leave指令的地址,leave=0x400699 bank在bss段上的地址 设置rdi寄存器的指令地址…
[V&N2020 公开赛]warmup 附件 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将puts函数的地址泄露给了我们 sub_84D()函数里面是prctl函数的沙箱机制 可以利用seccomp-tools工具来查看一下限制了哪些函数 禁止了execve和fork syscall, 关于seccomp-tools工具的安装和使用看这篇文章,关于prctl函数可以看一下这篇文章 sub_9D3…