Uncategorized
2.9k words
Description 题目描述:忘了 附件内容: from Crypto.Util.number import * from random import * from libnum import * import gmpy2 from secret import x flag = b'?????????' m = bytes_to_long(flag) def obfuscate(p, k): nbit = p.bit_length() while True: l1 = [getRandomRange(-1, 1) for _ in '_' * k] l2 = [getRandomRange(100, nbit) for _ in '_' * k] l3 = [getRandomRange(10, nbit//4) for _ in '_' * k] l4 = [getRandomRange(2, 6) for _ in '_' *k] A = sum([l1[_] * 2 ** ...
Uncategorized
534k words
我是傻逼 Description 题目描述:忘了 附件内容 from secret import p, q, flag from Crypto.Util.number import bytes_to_long def gcd(a, b): s = 0 while b != 0: print(a, b) if isOdd(a): if isOdd(b): a = a - b a = rshift1(a) if a < b: a, b = b, a else: b = rshift1(b) if a < b: a, b = b, a else: if isOdd(b): ...
Uncategorized
2.3k words
前言 这题当时国赛的时候由于没有怎么碰过MISC,到最后一步没做出来,实在是难受,今天复盘了一下 Analyze 拿到题目附件是一个流量包,可以看到分别有2.4.0,2.3.0,2.2.0,2.10.0,2.8.1,2.8.0这些地址的USB流量,我们可以一个一个筛选出来,然后通过导出特定分组进行保存,用UsbKeyboardDataHacker来提取其中的信息,最终会发现2.10.1和2.8.1中有有效信息 这里展示一下2.8.1的提取过程 # usb.src=="2.8.1"||usb.dst=="2.8.1" 31 0.010805 2.8.1 host USB 35 URB_INTERRUPT in 32 0.010818 host 2.8.1 USB 27 URB_INTERRUPT in 33 0.110764 2.8.1 host USB 35 URB_INTERRUPT in 34 0.110777 host 2.8.1 USB 27 URB_INTERRUPT in 35 0.166...
Uncategorized
13k words
通过file指令可以看到程序编译的链接状态,在知道程序可以通过ROP来打的情况下,根据statically linked和dynamically linked两种链接方式来构造对应的ropchain和对应不同的攻击思路 dynamically linked 如果程序是动态链接的话,泄露程序函数的真实地址后拿到libc基址去得到例如system和/bin/sh的地址,这里不再赘述 statically linked 如果程序是静态链接,相对与动态链接就没有那么麻烦了,有的程序我们可以通过ROPgadget这个工具来帮助我们构造我们的ropchain ROPgadget --binary 程序名 --ropchain Example-inndyrop m1nus@ubuntu:~/elf/buu/inndy_rop$ file inndy_rop inndy_rop: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, Buil...
Uncategorized
537 words
为什么需要stack pivoting 当stack overflow的空间不足时 怎么实现stack pivoting 通过将ebp覆盖成构造的fake_ebp,然后利用leave_ret这个gadget将esp劫持到fake_ebp的地址上,从而实现栈的迁移 为什么是leave ret leave: mov esp , ebp; pop ebp; ret: pop eip 实现过程 首先程序有stack overflow漏洞,我们将栈覆盖成下面的样子 执行完mov esp , ebp后 接着就是pop ebp,执行完后如图 由于esp是栈顶指针,当pop ebp后,栈顶的元素被弹给了ebp,所以esp应当向下移4个字节,也就是一个单位 下一步通过read()函数的ret来把内容输入到fake_ebp1地址上,这里主要是要将fake_ebp2的地址给到fake_ebp1的地址上 下一步就来到了leave_ret,也就是重复上方的mov esp,ebp pop ebp和pop eip mov esp,ebp 后 接着pop ebp,由于fake_...
Uncategorized
2.5k words
Stack Smashing 当canary被覆盖后,会call到__stack_chk_fail打印argv[0]这个指针指向的字符串,默认是程序的名字,如果我们把它覆盖为其他的地址时,它就会把其他内存地址的信息给打印出来 Example:wdb2018_guess Analyze Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000) This is GUESS FLAG CHALLENGE! Please type your guessing flag 123 You should take more effort to get six sence, and one more challenge!! Please type your guessing flag 以上是程序开启的一些保护和大概的流程 main __int64 __fastcall main(__int64 a1, char ...
Uncategorized
1.6k words
axb_2019_fmt32 Involved Knowledge format string Checksec Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Program Hello,I am a computer Repeater updated. After a lot of machine learning,I know that the essence of man is a reread machine! So I'll answer whatever you say! Please tell me:123 Repeater:123 Analyze main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { char s[257]; // ...