zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/gaonuoqi/p/11750593.html
Copyright © 2011-2022 走看看