• Pwnable-leg


    Download : http://pwnable.kr/bin/leg.c

    Download : http://pwnable.kr/bin/leg.asm

    友链

    https://blog.csdn.net/lee_ham/article/details/78398551

    下载之后,看看C的源码

    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);

    (key1()+key2()+key3()) == key就可以获得flag

    之后打开另一个文件,是asm汇编语言,一个main函数和三个小部分key

    来逐一看看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.

    将PC赋值给r3,然后r3在给r0,而r0是函数的返回值,PC(program point)指向的是执行语句地址+8,即0x08cdc+8=0x08ce4,所以key1是0x08ce4

    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

    先看到pc和r6相加 0x08d04+0x1,然后再bx r6变成thumb状态(根据地址的最低位确定是否状态切换。如果末尾是1则切换到thumb状态,否则保留在asm状态)

    之后pc+4赋值给r3(thumb状态,pc+4,asm状态则+8) 再通过adds把r3再加0x4,通过两次相加使得r3=PC+4+4,再赋值给r0 ,

    所以r0=PC+4+4=0x8d0c, 即key2=0x8d0c

    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
    

    lr(link register)寄存器存储的是函数的返回地址,指向main函数,看看main函数

     0x00008d7c <+64>:    bl    0x8d20 <key3>
     0x00008d80 <+68>:    mov    r3, r0

    key3=0x8d80

    之后相加即可

    执行获取flag

     

     My daddy has a lot of ARMv5te muscle!

  • 相关阅读:
    SharedPreferences 使用
    activity在activity上面
    组合组件
    浏览器的渲染原理
    Node 入门<1>
    css 样式优先级
    z-index
    事件代理
    XSS && CRLF && property&attribute
    webpack 学习笔记
  • 原文地址:https://www.cnblogs.com/gaonuoqi/p/11750593.html
Copyright © 2020-2023  润新知