pwn
文章平均质量分 55
call就不要ret
大菜鸡一个,致力于向各位师傅学习,喜爱二进制安全。热爱钻研技术
展开
-
BUUCTF--mrctf2020_shellcode1
正在我想如何覆盖返回地址的时候,发现题目直接帮你搞好了。取buf的的地址(栈上)然后跳转到buf位置执行代码。主函数中无法反汇编,那么我们直接看汇编代码。其实很简单,通过系统调用执行puts函数,然后执行read函数。这是一题64位的shellocde题,没啥花招入门题。原创 2024-01-27 12:05:28 · 618 阅读 · 0 评论 -
BUUCTF--get_started_3dsctf_20161
题目一进来有很多函数,盲猜是静态编译了。而且在函数堆中发现了个get_flag。信心慢慢的直接写代码返回get_flag地址。2.这题在main函数开始的时候没有压入ebp,因此计算溢出位置不用覆盖ebp。也就是说以前的old_ebp的位置变成了现在的返回地址。1.打远程的时候他将会判断参数是否合规,因此我们要构造get_flag的参数的正确性。这题我本来以为是简单的ret2text.结果还是中了小坑。4.构造垃圾数据不用b‘a',打不通。这题还有一种解法,我是看别的师傅wp才知道的。原创 2024-01-12 16:48:11 · 442 阅读 · 0 评论 -
BUUCTF--ciscn_2019_s_31
ret_rax_59->ret_400596->pop_rbx->pop_rbp->pop_r12->pop_r13->pop_r14->pop_r15->ret_400580->'a'*56(因为会再次pop_rbx到pop_r15)->pop_rdi->bin/sh参数地址->syscall参数。从上面我们可以看到buf的大小是16,但是write的大小有0x30,肯定是泄露了栈上的其他信息。输入一个字节都能触发段错误,并且还跟了一串不知道啥来的东西,盲猜是栈上的数据泄露。原创 2024-01-09 13:14:28 · 368 阅读 · 0 评论 -
BUUCTF--铁人三项(第五赛区)_2018_rop1
我这是打本地的代码,远程的话给了libc用libc,没给libc用LibcSearcher,个人感觉不太好用,很多时候找不到。漏洞点主要在vulnerable_function()函数中。1.第一次布局通过题目中的write,puts等函数将库函数地址泄露,并能返回到主程序。2.通过计算算出libc基地址进一步得到system地址。这题是一题标准的rop。3.找到libc中bin/sh的位置。4.第二次布局就是直接布置rop。原创 2024-01-08 12:52:27 · 502 阅读 · 0 评论 -
BUUCTF--actf_2019_babyheap1
因为题目不能改写got表,但是题目给了system函数地址和bin/sh。因此我们的利用就简单了。直接利用show的调用方式去调用system函数。想办法把索引堆释放并申请回来,在上面布局我们的system(bin/sh)题目提供增删查,没有改。逻辑跟我前面做的一题极为相似,就不过多分析。圈起来的是索引堆的内容。原创 2024-01-07 01:21:08 · 385 阅读 · 0 评论 -
BUUCTF--pwnable_start1
主要就2个功能,通过系统调用来执行读写功能,将字符串Let's start the CTF:输出,然后接收用户输入。也就是我们能刚好覆盖到返回地址,但是我的shellcode有0x18个字节。而且我们惊奇的发现,这两个值相差0x4,因此我们需要通过write函数将他泄露出来,紧着这我们的返回地址就有了,步骤shellocode就是要返回到布局的栈地址处执行。此时esp要索引到返回地址,将直接执行add esp,14h。存在栈溢出,那么这题的想法就是直接ret2shellcode了。原创 2024-01-06 17:45:19 · 367 阅读 · 0 评论 -
BUUCTF--gyctf_2020_borrowstack1
迁到什么地方呢,肯定就是这个bank所在的地方了。我们还需要考虑一些细节上的东西,首先我们需要知道libc的基地址,因此我们需要通过puts函数来泄露。后续的操作就很简单,通过泄露的puts函数地址,计算出libc的基地址,当程序再次回到主函数时,直接将栈上的返回地址覆盖成one_gadget拿到权限。接下来的操作基本都是pop,因此rsp是从低地址到高地址跑(每次pop,rsp+8),所以我们顺序布局就可以。old_rbp覆盖成我们的bss段,让rbp指过去,接着返回地址需要再调用一次leave。原创 2024-01-05 18:31:47 · 351 阅读 · 0 评论 -
BUUCTF--hitcontraining_heapcreator1
此时往chunk3这个用户堆写数据,将会写入free_got表里,这样我们可以将伪造的system的地址写入free_got表,一旦调用free,将会去执行system。2.接着修改chunk0的内容填入bin/sh作为后续system的参数,利用off-by-one并修改下一个索引chunk的大小为0x81(覆盖的是chunk1的索引堆)。这句其实可以这样解读read(0,对应索引堆里的那个堆地址,Size),现在他将变成这样read(0,&free_got,Size)。以此来达到我们的目的。原创 2024-01-05 01:30:19 · 400 阅读 · 0 评论 -
BUUCTF--ciscn_2019_s_91
一段汇编,因此,这题就是个ret2shellcode。这题没啥好讲的,主要是手写shellcode和调试布局。我们看看payload后布局时啥样的,为什么还要sub esp,40;经过测试发现了段错误,这肯定就是栈溢出了。的位置,那么e0-b8的大小等于0x28也就是10进制的40.接着再跳到。我已经将注释放上,可以看到,当执行到返回地址后,esp将指向。,此时,我们需要让他去到。原创 2024-01-03 21:56:45 · 352 阅读 · 0 评论 -
关于wiki的Unlink攻击理解--附例题BUUCTF-hitcontraining_bamboobox1
我们知道P的fd和bk都是我们自己构造的。我们假设程序通过溢出或者UAF修改了chunk2的fd和bk,我这里让chunk2的fd指向free的got表地址,bk指向一段内存中我们可读可写可执行的地方(也就是能布置shellcode的)。这样构造的目的是改写下一个chunk的标志位,触发fake_chunk能够进行unlink操作,并且在第二个chunk的数据域构造一个伪chunk。其实就是所谓的断链操作,让P的前一个chunk指向后一个chunk,然后P的后一个chunk指回P的前一个chunk。原创 2023-12-02 01:08:35 · 148 阅读 · 0 评论 -
BUUCTF-pwn-ciscn_2019_ne_51
我们看到strcpy是将src的内容复制到dest。我们前面看到src允许我们输入128个字节。而dest数组离ebp只有0x48个字节。32为程序没有canary没有PIE,应该是简单的栈溢出。程序上来是输入一个密码验证。随便输入下错误直接退出。那么我们需要构造的东西都有了,接着就是找溢出点。它会把我们的输入放入src这个数组中。主函数大致流程在此。当找不到/bin/sh的时候,可以用sh代替。这里就有一个小技巧了。原创 2023-11-29 22:56:29 · 138 阅读 · 0 评论 -
BUUCTF刷题之路-pwn-ciscn_2019_n_81
题查保护的时候吓了一跳,保护全开。大致看出var是个数组,当var[13]=17的时候就会得到system。原创 2023-11-29 21:28:03 · 135 阅读 · 0 评论 -
fastbins_Double Free调试
在我们程序第一次分配内存的时候,bins中是没有任何可以用的内存。此时我们在fastbins中会有三个chunk,因为libc没有再这里设置过硬的检查,并且这块空间在free的时候没有置为NULL,因此这片空间能够被当成正常的chunk在fastbins中链接。到目前为止,程序执行流程大致是glibc在malloc真正执行前,会先去检查是否有用户自定义的hook函数,如果有,就先行调用,如果没有就按正常的malloc执行。我们首先得知道,在fastbins中,被释放的chunk都是单链表链接起来的。原创 2023-11-12 18:16:27 · 105 阅读 · 0 评论 -
BUUCTF刷题之路--ez_pz_hackover_20161
因此这个函数里是存在栈溢出漏洞的,我们需要执行这个函数。因此我们需要在一开始的输入就构造好我们的shellcode,和shellcode的地址。根据IDA的提示,s数组应该在ebp的上面0x40c个字节处,而dest应该在ebp上面的0x32字节处.但是当我进行输入调试的时候发现ebp在我输入缓冲区的上面。ebp的偏移看到是0x38,我们输入的位置是0x22 ,因为63是c,72是r,0000不是我们输入的。将计就计,既然我们只有一次输入机会,那么我们构造完返回地址后,肯定跟的是我们的shellcode。原创 2023-06-28 16:21:06 · 187 阅读 · 0 评论 -
BUUCTF刷题之路--bjdctf_2020_babystack21
如果这个数小于10就能执行read,但是read的第三个参数就会变成我们的传入的数。然后我们再仔细看,nbytes这个变量从int类型转换成了unsigned int类型。意思就是说这里人为的创造了一个整数溢出。那么我们只要输入一个负数就能逃避if的检查。但是在调试的时候,我输入负数在read函数那里会直接跳过输入。于是我迫不及待的在靶机上测试,在主函数中只有我们输入的数字不超过10就能得到执行read函数的机会。今天一摸题两眼一麻黑,忘的都差不多了。我输入了一个3,接着我们继续调试到read函数中。原创 2023-06-26 20:31:51 · 86 阅读 · 0 评论 -
ret2libc类型题目思考-ret2libc2
解析一下这样的布局,因为是栈溢出,所以我们要在溢出点做手脚填充112个字节的a来覆盖到返回地址,如何计算的填充数据的大小在ret2libc1中有很详细的讲解,这里就不再赘述,接下来,我们需要想先调用gets函数来让把我们输入的字符放入buf2,那么我们就需要调用gets函数的同时,把buf2的地址当参数传给gets函数。那么又有人问,中间的pop ebx的作用又是什么呢,其实它的作用是为了堆栈平衡的,用来把用完的buf2给弹出堆栈,方便ret的时候能正确指向system函数。因此我们完整的利用链就完成了。原创 2023-06-03 01:18:30 · 213 阅读 · 0 评论 -
BUUCTF刷题之路-ciscn_2019_s_31
既然是栈溢出嘛,我们当然想调用system('/bin/sh')很可惜的是程序中没有给出,那就考虑是不是ret2libc,但是程序中我们并没有发现存在泄漏got表的代码,在看一眼函数列表我们看到了一个程序必带的初始化函数:_libc_csu_init这是做csu题目的基础。首先rax=59并且syscall的地址我们都已经有了,接着我们看如何构造bin/sh,我尝试过在程序中查找字符串,并没有结果,那么我们只能通过read函数写进去,并且我们准确把握写入的位置以便利用,所以我们需要泄露栈地址。原创 2023-05-31 22:54:02 · 334 阅读 · 3 评论 -
ret2libc类型题目思考-ret2libc1
一眼看到栈溢出,ret2libc这类型的题目就是要利用栈溢出将控制流转移到glibc库的函数中。这里我们一定是找的plt表而不是system字符串的地址,这是要分清楚的。关于plt表和got表参考我的其他博客,这个玩意我也理解了很久比较愚钝。但是我在IDA看到距离ebp是0x64h,就算换算成10进制在加4也是104,当时我就觉得很疑惑。打算复现CTFwiki中的三个ret2libc类型的实现。当函数要返回的时候,他将跳到system函数的地址去执行,此时他将把ebp+4的内容当做函数的第一个参数传递。原创 2023-05-29 00:47:11 · 176 阅读 · 0 评论 -
BUUCTF刷题之路-jarvisoj_level01
看到个read函数,而且能输入的最大字节数为512字节。而buf我们看到是128字节的限度,那应该是存在栈溢出的问题。而且我们直接看到有个后门函数,和前面几题的套路如出一辙。原创 2023-05-27 18:32:55 · 201 阅读 · 0 评论 -
BUUCTF刷题之路-pwn1_sctf_20161
从我们的运行结果看,会把用户输入的I换成you。那就是说会自动帮我们把1字节变3字节,我们可以利用填充I来让程序自动填充到返回地址前。s距离ebp是0x3c也就是60个字节,那么我们填充20个I再加4个字节填充接着拼接我们的后门地址。但是新的问题产生了,fgets函数较gets函数安全一点,他有长度限制,我们看到s离ebp的距离有0x3c那么远,但是fgets只能输入32个字节,只通过fgets溢出覆盖不到返回地址。看到有个fgets函数,并且限制长度为32。这是一个32位的程序,只开启了NX保护。原创 2023-05-27 18:09:21 · 410 阅读 · 0 评论 -
BUUCTF刷题之路-ciscn_2019_n_11
非常简单的逻辑,类似于一个猜数字游戏,猜对了弹出flag,失败了还贴心的告诉你可能值。我们要做的就是修改v2变量的内容,让他等于11.28125。这次我们不需要覆盖返回地址只需要改v2的值就好了。接着我们算一下偏移【rbp-30h-rbp+4h】得到偏移为44个字节。意思就是说我们在44个字节之后填入11.28125覆盖v2的值就能使if语句成立。题目只开启了堆栈不可执行。无非就是不能在栈上执行shellcode无伤大雅。原创 2023-05-27 13:26:51 · 177 阅读 · 1 评论 -
BUUCTF刷题之路-rip1
因为A存入内存是以ASCLL码形式存在 0x41就是A,我们填入的15个A已经在栈上了,而且返回地址就是401100,我们要做的就是覆盖这个返回地址,指向我们的后门函数fun,至此这题就完成了。让我们能得到一个shell.那我们就找一下这个fun函数的地址,因为题目没有开启PIE,所以程序每次加载的地址都是不变的。可以看到保护基本没开,是个很简单的栈溢出题目。左边这都是函数,带下划线的一般是系统提供的函数,我们分析前可以大致看看有哪些函数,都干了什么,对整体布局有个了解,我们一开始都回去分析main函数。原创 2023-05-25 23:35:57 · 1173 阅读 · 0 评论 -
BUUCTF刷题之路-test_your_nc1
我们看到题目给了IP地址和端口号 直接在Linux上使用nc node4.buuoj.cn 28346得到flag。pwn分类中第一题很简单,就是一个nc,考察的是linux远程链接nc的命令用法,直接使用就能得到flag。也是我们pwn之路的第一步,以后我们打CTF的时候最终都要nc它。原创 2023-05-25 22:35:26 · 480 阅读 · 2 评论