• pwnable


    step by step

    leg.c:

    #include <stdio.h>
    #include <fcntl.h>
    int key1(){
        asm("mov r3, pc
    ");
    }
    int key2(){
        asm(
        "push    {r6}
    "
        "add    r6, pc, $1
    "
        "bx    r6
    "
        ".code   16
    "
        "mov    r3, pc
    "
        "add    r3, $0x4
    "
        "push    {r3}
    "
        "pop    {pc}
    "
        ".code    32
    "
        "pop    {r6}
    "
        );
    }
    int key3(){
        asm("mov r3, lr
    ");
    }
    int main(){
        int key=0;
        printf("Daddy has very strong arm! : ");
        scanf("%d", &key);
        if( (key1()+key2()+key3()) == key ){
            printf("Congratz!
    ");
            int fd = open("flag", O_RDONLY);
            char buf[100];
            int r = read(fd, buf, 100);
            write(0, buf, r);
        }
        else{
            printf("I have strong leg :P
    ");
        }
        return 0;
    }

    leg.asm:

    (gdb) disass main
    Dump of assembler code for function main:
       0x00008d3c <+0>:    push    {r4, r11, lr}
       0x00008d40 <+4>:    add    r11, sp, #8
       0x00008d44 <+8>:    sub    sp, sp, #12
       0x00008d48 <+12>:    mov    r3, #0
       0x00008d4c <+16>:    str    r3, [r11, #-16]
       0x00008d50 <+20>:    ldr    r0, [pc, #104]    ; 0x8dc0 <main+132>
       0x00008d54 <+24>:    bl    0xfb6c <printf>
       0x00008d58 <+28>:    sub    r3, r11, #16
       0x00008d5c <+32>:    ldr    r0, [pc, #96]    ; 0x8dc4 <main+136>
       0x00008d60 <+36>:    mov    r1, r3
       0x00008d64 <+40>:    bl    0xfbd8 <__isoc99_scanf>
       0x00008d68 <+44>:    bl    0x8cd4 <key1>
       0x00008d6c <+48>:    mov    r4, r0
       0x00008d70 <+52>:    bl    0x8cf0 <key2>
       0x00008d74 <+56>:    mov    r3, r0
       0x00008d78 <+60>:    add    r4, r4, r3
       0x00008d7c <+64>:    bl    0x8d20 <key3>
       0x00008d80 <+68>:    mov    r3, r0
       0x00008d84 <+72>:    add    r2, r4, r3
       0x00008d88 <+76>:    ldr    r3, [r11, #-16]
       0x00008d8c <+80>:    cmp    r2, r3
       0x00008d90 <+84>:    bne    0x8da8 <main+108>
       0x00008d94 <+88>:    ldr    r0, [pc, #44]    ; 0x8dc8 <main+140>
       0x00008d98 <+92>:    bl    0x1050c <puts>
       0x00008d9c <+96>:    ldr    r0, [pc, #40]    ; 0x8dcc <main+144>
       0x00008da0 <+100>:    bl    0xf89c <system>
       0x00008da4 <+104>:    b    0x8db0 <main+116>
       0x00008da8 <+108>:    ldr    r0, [pc, #32]    ; 0x8dd0 <main+148>
       0x00008dac <+112>:    bl    0x1050c <puts>
       0x00008db0 <+116>:    mov    r3, #0
       0x00008db4 <+120>:    mov    r0, r3
       0x00008db8 <+124>:    sub    sp, r11, #8
       0x00008dbc <+128>:    pop    {r4, r11, pc}
       0x00008dc0 <+132>:    andeq    r10, r6, r12, lsl #9
       0x00008dc4 <+136>:    andeq    r10, r6, r12, lsr #9
       0x00008dc8 <+140>:            ; <UNDEFINED> instruction: 0x0006a4b0
       0x00008dcc <+144>:            ; <UNDEFINED> instruction: 0x0006a4bc
       0x00008dd0 <+148>:    andeq    r10, r6, r4, asr #9
    End of assembler dump.
    (gdb) disass key1
    Dump of assembler code for function key1:
       0x00008cd4 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008cd8 <+4>:    add    r11, sp, #0
       0x00008cdc <+8>:    mov    r3, pc
       0x00008ce0 <+12>:    mov    r0, r3
       0x00008ce4 <+16>:    sub    sp, r11, #0
       0x00008ce8 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008cec <+24>:    bx    lr
    End of assembler dump.
    (gdb) disass key2
    Dump of assembler code for function key2:
       0x00008cf0 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008cf4 <+4>:    add    r11, sp, #0
       0x00008cf8 <+8>:    push    {r6}        ; (str r6, [sp, #-4]!)
       0x00008cfc <+12>:    add    r6, pc, #1
       0x00008d00 <+16>:    bx    r6
       0x00008d04 <+20>:    mov    r3, pc
       0x00008d06 <+22>:    adds    r3, #4
       0x00008d08 <+24>:    push    {r3}
       0x00008d0a <+26>:    pop    {pc}
       0x00008d0c <+28>:    pop    {r6}        ; (ldr r6, [sp], #4)
       0x00008d10 <+32>:    mov    r0, r3
       0x00008d14 <+36>:    sub    sp, r11, #0
       0x00008d18 <+40>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008d1c <+44>:    bx    lr
    End of assembler dump.
    (gdb) disass key3
    Dump of assembler code for function key3:
       0x00008d20 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008d24 <+4>:    add    r11, sp, #0
       0x00008d28 <+8>:    mov    r3, lr
       0x00008d2c <+12>:    mov    r0, r3
       0x00008d30 <+16>:    sub    sp, r11, #0
       0x00008d34 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008d38 <+24>:    bx    lr
    End of assembler dump.
    (gdb) 

    和汇编有关。

    这是arm汇编。

    .c文件中看出,要满足条件:

    (key1()+key2()+key3()) == key
    即可。
    (arm汇编中,r0存返回值,pc指向下条指令的下条指令)
    计算三个key函数的返回值,看汇编代码。
    key1:
    (gdb) disass key1
    Dump of assembler code for function key1:
       0x00008cd4 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008cd8 <+4>:    add    r11, sp, #0
       0x00008cdc <+8>:    mov    r3, pc
       0x00008ce0 <+12>:    mov    r0, r3
       0x00008ce4 <+16>:    sub    sp, r11, #0
       0x00008ce8 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008cec <+24>:    bx    lr
    End of assembler dump.
    0x00008cdc <+8>:    mov    r3, pc
    这里pc=0x8ce4
    传给了r3,又传给r0,返回r0=0x8ce4
    key2:
    (gdb) disass key2
    Dump of assembler code for function key2:
       0x00008cf0 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008cf4 <+4>:    add    r11, sp, #0
       0x00008cf8 <+8>:    push    {r6}        ; (str r6, [sp, #-4]!)
       0x00008cfc <+12>:    add    r6, pc, #1
       0x00008d00 <+16>:    bx    r6
       0x00008d04 <+20>:    mov    r3, pc
       0x00008d06 <+22>:    adds    r3, #4
       0x00008d08 <+24>:    push    {r3}
       0x00008d0a <+26>:    pop    {pc}
       0x00008d0c <+28>:    pop    {r6}        ; (ldr r6, [sp], #4)
       0x00008d10 <+32>:    mov    r0, r3
       0x00008d14 <+36>:    sub    sp, r11, #0
       0x00008d18 <+40>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008d1c <+44>:    bx    lr
    End of assembler dump.
    0x00008d04 <+20>:    mov    r3, pc
    pc = 0x8d08
    +4
    r0=pc+4
    返回r0=0x8d0c
    key3:
    (gdb) disass key3
    Dump of assembler code for function key3:
       0x00008d20 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)
       0x00008d24 <+4>:    add    r11, sp, #0
       0x00008d28 <+8>:    mov    r3, lr
       0x00008d2c <+12>:    mov    r0, r3
       0x00008d30 <+16>:    sub    sp, r11, #0
       0x00008d34 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)
       0x00008d38 <+24>:    bx    lr
    End of assembler dump.

    lr放到r3,lr存的是函数返回后要执行的指令地址。在这里也就是

     0x00008d80 <+68>:	mov	r3, r0
    的地址0x8d80

    三者加起来=108400

    输入得到结果。

    在了解arm对应寄存器后,很简单
  • 相关阅读:
    Mac 安装FFMpeg 与 FFmpeg 格式转换
    django channels
    python3 coroutine
    python中关于sql 添加参数
    python导包的问题
    python中的列表
    django中用model生成数据库表结构
    docker
    博客大神地址
    Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
  • 原文地址:https://www.cnblogs.com/gudygudy/p/10895382.html
Copyright © 2020-2023  润新知