This is an old revision of the document!
TODO
By going through the echo_service.c
file we see that in the echo_service()
function we use read()
for reading 4096
bytes when we only have 1024
available for a the buf
buffer. We can use this to create a return-oriented programming (ROP) attack.
Let's first consider our steps.
buf
buffer and rewrites the return address of the echo_service()
function triggering the attack (the ROP chain).dup2(sockfd, 1);
dup2(sockfd, 0);
system(“/bin/sh”);
netcat
to send the payload to the server to trigger the attack.We aim for the stack to be the one below:
0x00000000 ... start address of buf ... +--------------------------------+ | dup2() address | <--- return address for echo_service() +--------------------------------+ | pop_pop_ret gadget address | +--------------------------------+ | 4 | +--------------------------------+ | 1 | +--------------------------------+ | dup2() address | +--------------------------------+ | pop_pop_ret gadget address | +--------------------------------+ | 4 | +--------------------------------+ | 0 | +--------------------------------+ | system() address | +--------------------------------+ | junk | +--------------------------------+ | "/bin/sh" address | +--------------------------------+ ... 0xFFFFFFFF
In the above figure we will overflow the buf
buffer and overwrite the return address for the echo_service()
function with the first part of the ROP chain: the address of the dup2()
function. Once the dup2()
function returns it will call a ROP gadget that pops two values: the dup2()
function arguments (4
is sockfd
and 0
and 1
are standard input and standard output file descriptors respectively). Then another dup2()
function gets called and then system(“/bin/sh”)
. Because this needs the address of the /bin/sh
string it could only happen on non-ASLR enabled system; but we'll use some tricks to trick it into running on an ASLR-enabled system as well.