首页 > 其他分享 >BUUCTF [GXYCTF2019]luck_guy RE

BUUCTF [GXYCTF2019]luck_guy RE

时间:2023-02-19 15:15:01浏览次数:52  
标签:__ f2 BUUCTF int rbp RE flag guy rsp

无壳64位
img
IDA64 打开,查看主函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+14h] [rbp-Ch] BYREF
  unsigned __int64 v5; // [rsp+18h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  welcome(argc, argv, envp);
  puts("_________________");
  puts("try to patch me and find flag");
  v4 = 0;
  puts("please input a lucky number");
  __isoc99_scanf("%d", &v4);
  patch_me(v4);
  puts("OK,see you again");
  return 0;
}

一眼找到patch_me()函数

int __fastcall patch_me(int a1)
{
  int result; // eax

  if ( a1 % 2 == 1 )
    result = puts("just finished");
  else
    result = get_flag();
  return result;
}

如果输入的是偶数就进入get_flag()函数,继续跟踪

unsigned __int64 get_flag()
{
  unsigned int v0; // eax
  int i; // [rsp+4h] [rbp-3Ch]
  int j; // [rsp+8h] [rbp-38h]
  __int64 s; // [rsp+10h] [rbp-30h] BYREF
  char v5; // [rsp+18h] [rbp-28h]
  unsigned __int64 v6; // [rsp+38h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  v0 = time(0LL);
  srand(v0);
  for ( i = 0; i <= 4; ++i )
  {
    switch ( rand() % 200 )
    {
      case 1:
        puts("OK, it's flag:");
        memset(&s, 0, 0x28uLL);
        strcat((char *)&s, f1);
        strcat((char *)&s, &f2);
        printf("%s", (const char *)&s);
        break;
      case 2:
        printf("Solar not like you");
        break;
      case 3:
        printf("Solar want a girlfriend");
        break;
      case 4:
        s = 0x7F666F6067756369LL;
        v5 = 0;
        strcat(&f2, (const char *)&s);
        break;
      case 5:
        for ( j = 0; j <= 7; ++j )
        {
          if ( j % 2 == 1 )
            *(&f2 + j) -= 2;
          else
            --*(&f2 + j);
        }
        break;
      default:
        puts("emmm,you can't find flag 23333");
        break;
    }
  }
  return __readfsqword(0x28u) ^ v6;
}

随机生成五个数然后执行switch语句
case2、case3、default不重要
case1将f1f2连接作为flag
其中f1已知为GXY{do_not_
img
f2为空
img
case4将s = 0x7F666F6067756369LL复制给f2
由于小端序所以f2=[0x69,0x63,0x75,0x67,0x60,0x6F,0x66,0x7F]
case5对f2进行调整
奇数位-2,偶数位-1
猜测执行顺序应该是case4,case5,case1
脚本如下

f2=[0x69,0x63,0x75,0x67,0x60,0x6F,0x66,0x7F]
flag="GXY{do_not_"
for i in range(8):
    if(i%2): flag+=chr(f2[i]-2)
    else: flag+=chr(f2[i]-1)
print(flag)

flagGXY{do_not_hate_me}
提交上去是错的,改成flag{do_not_hate_me}就对了

标签:__,f2,BUUCTF,int,rbp,RE,flag,guy,rsp
From: https://www.cnblogs.com/Tree-24/p/17134736.html

相关文章

  • 软件报错“Component 'mscomctl.ocx' or one of its dependencies not correctlyregis
    报错图   报错原因 mscomctl.ocx是公用ActiveX插件控制模块,MSCOMCTL.OCX为Windows的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要......
  • nginx之rewrite四种flag
    利用nginx的rewrite命令,可以实现URL的重写,可在nginx配置文件的server、location、if部分使用,对于rewrite有四种不同的flag。redirect:返回302临时重定向,浏览器地址栏会显示......
  • 【算法】数组的前缀和 Prefix Sum
    算法中有前缀和这样一种很好的数据结构,它能极大地降低区间查询的时间复杂度前缀和-PrefixSum 它是这样的,假如有这样一个数组(序列), A=[a1,a2,a3,a4,a5,a6,......
  • 使用 Firefox (火狐)浏览器 必开的配置
    首先,在网址输入框中输入about:config进入浏览器配置页面设置打开书签的时候在新标签页打开然后搜索browser.tabs.loadBookmarksInTabs并将它的值改为trueFirefox......
  • 【JDK特性】stream 里面的map和flatMap区别
    背景JDK8中,stream流程下的map就不多说了,很熟悉,flatmap倒是不是特别熟悉,map和flatMap的区别看一个例子:List<String>cityListOne=newArrayList<>();......
  • lock_free concurrent data structure
    阻塞的算法和数据结构使用mutex、条件变量、期值来同步数据,但非阻塞不等价于lock-free,比如自旋锁没有使用任何阻塞函数的调用,是非阻塞的,但并非lock-free非阻塞数据结构......
  • swap file “*.swp”already exists解决方法
    查看删除即可。......
  • Net6 Core Api(.net6)发布到IIS注意事项及显示HTTP 错误500.19解决方法
    Net6CoreApi发布到IIS不同于webapi,依赖框架不同,配置也移至项目内Program.cs一、发布到指定文件夹,和IIS,不过注意IIS应用程序池选择的是“无托管代码“ 访问接口路径......
  • 限制textarea字数
    <dd><textarearows="4"cols="78"name="fbmessage"id="fbmessage"οnkeyup="countChar();">${requestScope.fb==null?'请输入公告':requestScope.fb.fbmessage}<......
  • java urlrewrite
    加入urlrewrite-3.2.0.jar包 在web.xml中加入<filter><filter-name>UrlRewriteFilter</filter-name><filter-class>org.tuckey.web.fi......