CTFPWN的一些题型(持续更新......)

ret2test

先运行一下,看程序做了些什么
CTFPWN的一些题型(持续更新......)_第1张图片
发现只是让我们输入一串字符。接下来具体分析下属性,并且丢进gdb里分析一下
在这里插入图片描述CTFPWN的一些题型(持续更新......)_第2张图片可以看到这是一个64位的程序,而且什么保护都没有开,接下来拖进IDA里继续分析

我们进入v4
CTFPWN的一些题型(持续更新......)_第3张图片F5反编译之后,可以很明显地看出程序有gets输入漏洞,gets可以读取无限长的字符串,我们就可以利用这个漏洞造成了一个栈溢出
CTFPWN的一些题型(持续更新......)_第4张图片CTFPWN的一些题型(持续更新......)_第5张图片
发现分配的栈的空间大小是70,由于程序在返回地址前还存放了ebp的地址,所以我们在覆盖的时候还需要在加8;同时我们发现在secure函数里存在调用system函数,查看地址
在这里插入图片描述发现调用位置在0x4007B8,编写exp
CTFPWN的一些题型(持续更新......)_第6张图片CTFPWN的一些题型(持续更新......)_第7张图片
得到flag

ret2libc

运行一下,顺便查看基本属性
CTFPWN的一些题型(持续更新......)_第8张图片发现是32位程序,功能是让我们输入一串字符,然后返回Hello World!
丢进gdb查看
CTFPWN的一些题型(持续更新......)_第9张图片发现开启了NX保护,接下来再放进IDA继续分析
CTFPWN的一些题型(持续更新......)_第10张图片F5查看伪码,发现调用了vulnerable_function函数,进去看一下
CTFPWN的一些题型(持续更新......)_第11张图片这个函数最后return出有一个很明显的缓冲区溢出,buf只有0x88,但是允许读入0x100,进一步查看
在这里插入图片描述CTFPWN的一些题型(持续更新......)_第12张图片
发现system函数在0x8048320处,打开字符串窗口,发现/bin/sh字段,进一步查看发现在0x804A024中,编写exp
CTFPWN的一些题型(持续更新......)_第13张图片由于buf大小为0x88,但是要覆盖到返回地址,还需要覆盖ebp的地址,由于是32位,所以需要+0x04;进入system后,需要构造system的栈帧,因为ebp+8才是第一个形参的地址,所以还需要4个字节填充,p32(0)的作用就是这样,最后加上/bin/sh的地址
CTFPWN的一些题型(持续更新......)_第14张图片得到flag

Ret2shellcode

直接分析
CTFPWN的一些题型(持续更新......)_第15张图片得到是32位程序,什么保护措施都没开,放进IDA里看看
CTFPWN的一些题型(持续更新......)_第16张图片显然,gets处存在栈溢出漏洞,而且题目也告诉我们了,没有system函数供我们调用;我们可以先进入buf2看看
在这里插入图片描述buf2是个bss段,由于程序没有开启NX和PIE保护,也就是说,我们可以把shellcode写在堆栈或者其他数据段上,然后利用IP寄存器指向那个地方,我们就可以得到shell了,但是在写exp之前,我们先确定偏移,这里用到cyclic这个指令
CTFPWN的一些题型(持续更新......)_第17张图片CTFPWN的一些题型(持续更新......)_第18张图片CTFPWN的一些题型(持续更新......)_第19张图片CTFPWN的一些题型(持续更新......)_第20张图片经过一系列操作,我们可以看到偏移值为112,开始编写exp
CTFPWN的一些题型(持续更新......)_第21张图片asm(shellcraft.sh())这里是pwntools自带的函数,里面是自带有写shellcode,我们直接用就行了,shellcode.ljust(112, ‘a’)这里的意思是,总长度112再减去shellcode的长度,剩下的部分用a来填充(垃圾数据),最后加上buf2的地址
CTFPWN的一些题型(持续更新......)_第22张图片成功获得控制权

ret2syscall

老规矩,先分析
CTFPWN的一些题型(持续更新......)_第23张图片32位文件,静态连接,同时打开了NX保护
然后打开IDA
CTFPWN的一些题型(持续更新......)_第24张图片同样gets函数可以利用(求偏移就不说了,前面有,这里的偏移是112),这个题目我们不能直接利用程序中的代码或者自己写代码来获得shell,这里我们用pwntools里的gadget来获得shell,涉及到的是利用系统调用
在这里插入图片描述CTFPWN的一些题型(持续更新......)_第25张图片输入上面的指令,我们可以直接看到可以拿到shell的调用指令,接下来我们就可以写exp了
CTFPWN的一些题型(持续更新......)_第26张图片CTFPWN的一些题型(持续更新......)_第27张图片成功获得权限

ret2libc2

和上面一样,先分析程序的基本信息
CTFPWN的一些题型(持续更新......)_第28张图片32位程序,开启了NX保护,打开IDA继续分析
CTFPWN的一些题型(持续更新......)_第29张图片同样gets处存在栈溢出漏洞,算出偏移值为112。继续分析
CTFPWN的一些题型(持续更新......)_第30张图片CTFPWN的一些题型(持续更新......)_第31张图片程序中带有system函数,查看字符串,发现并没有/bin/sh字段,那么该怎么办呢?
注意之前出现过的_bss_start,这是一个bss段,我们可以自己写入/bin/sh,然后利用gets跳转到system再跳转到这段bss,继续查看
在这里插入图片描述在这里插入图片描述我们看到system的PLT地址在0x8048490,gets的PLT地址在0x8048460,编写exp
CTFPWN的一些题型(持续更新......)_第32张图片payload =‘a’*112 + p32(gets_plt) + p32(system_plt) + p32(bss) + p32(bss)
这里首先填充垃圾数据造成溢出,然后用gets的调用地址覆盖函数的返回地址,因为gets输入后,我们需要调用system函数,所以接下来gets的返回地址是system函数的调用地址,接下去就是system需要的参数,也就是bss段地址,最后再构造gets所需要的的参数,同样我们输入的数据存放到bss处,运行
CTFPWN的一些题型(持续更新......)_第33张图片成功获得控制权

ret2libc3

和之前一样的步骤,这里就不重复了,直接用IDA打开,发现和之前一样,同样是栈溢出,但是不同的是
CTFPWN的一些题型(持续更新......)_第34张图片程序里没有system和/bin/sh给我们,同时程序开启了NX保护,但是程序没有开启PIE,就是说程序的GOT表以及PLT表的地址都是不变的,我们可以直接用里面的函数,继续查看
CTFPWN的一些题型(持续更新......)_第35张图片发现有puts,我们就可以利用puts来获得libc的版本,然后利用libc里的system函数和/bin/sh字符串,这里我们采用got表泄露获得程序libc的版本(此处偏移已提前算出),然后计算偏移等操作(详细在后面分析exp)来获得shell,直接写exp
CTFPWN的一些题型(持续更新......)_第36张图片这里我们来详细分析下exp:
pay =‘a’*112 + p32(elf.plt[‘puts’]) + p32(0x08048618) +p32(elf.got[’__libc_start_main’])
偏移值不必多说,接下我们直接调用puts的plt地址,相当于直接调用puts函数,返回地址我们直接返回主函数,接下来输入的p32(elf.got[’__libc_start_main’]),这里我们泄露 __libc_start_main 的地址,这是因为它是程序最初被执行的地方

libc_start_main_addr = u32(r.recv(4))
然后我们用libc_start_main_addr来获取地址,r.recv(4)是规定接收4个字节的地址,因为程序是32位的

libc = LibcSearcher(’__libc_start_main’, libc_start_main_addr)
libcbase = libc_start_main_addr - libc.dump(’__libc_start_main’)
这里就是求libc的基地址(基地址的计算:基地址=A的真实地址-A的偏移地址)

system_addr = libcbase + libc.dump(‘system’)
bin_sh = libcbase + libc.dump(‘str_bin_sh’)
这两行求的都是system和bin_sh的地址(同理:A的真实地址=基地址+A的偏移地址)

payload =‘a’*104 + p32(system_addr) + p32(0x08048618) + p32(bin_sh)
这里就是最后得到shell的payload,这里的返回地址不重要,可以填写垃圾数据,但是这里要提下,为什么这里是‘a’104,而不是112。注意
CTFPWN的一些题型(持续更新......)_第37张图片根据公式计算覆盖长度EBP+0x4-(ESP+0x1C)= 104
CTFPWN的一些题型(持续更新......)_第38张图片成功获得shell

stack pivoting

先检查程序基本属性
CTFPWN的一些题型(持续更新......)_第39张图片32位程序,没有开任何保护,运行程序,发现是让我们输入字符串,然后打印我们的输入,用IDA打开看看
CTFPWN的一些题型(持续更新......)_第40张图片很明显,这里又是一个fgets处的栈溢出,我们可以通过shellcode来获得shell,但是这个题目的栈溢出有长度限制,大小50,那么我们能够溢出的字节只有50-0x20-4=14,用我们之前的shellcode来的话,会被截断。这里我们先列出基本思路,利用栈溢出来弄shellcode,再控制eip来指向shellcode,但是由于程序本身会开启 ASLR 保护,所以我们很难直接知道shellcode 的地址,但是栈上相对偏移是固定的,所以我们可以利用栈溢出对 esp 进行操作,使其指向 shellcode处。这里我们用ROPgadget找到程序跳转到esp的gadget
CTFPWN的一些题型(持续更新......)_第41张图片
这里我们就找到了0x08048504这个地址;接下来我们想想payload的最后一部分怎么写,前面的shellcode+padding+虚假ebp+0x08048504就是0x28,所以最后我们要执行的指令为sub 0x28,esp;jmp esp,编写exp
CTFPWN的一些题型(持续更新......)_第42张图片
这里的shellcode是\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80,长度为21,运行
CTFPWN的一些题型(持续更新......)_第43张图片获得shell

你可能感兴趣的:(CTF)