首页
社区
课程
招聘
[原创]看雪.纽盾 KCTF晋级赛2019 Q2 第三题 金字塔的诅咒
发表于: 2019-6-23 02:51 4882

[原创]看雪.纽盾 KCTF晋级赛2019 Q2 第三题 金字塔的诅咒

2019-6-23 02:51
4882
先checksec

看下main的代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  char buf; // [esp+0h] [ebp-10h]
  unsigned int v6; // [esp+4h] [ebp-Ch]
  int *v7; // [esp+8h] [ebp-8h]

  v7 = &argc;
  v6 = __readgsdword(0x14u);
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  puts("Welcome to kanxue 2019, your pwn like cxk");
  do
  {
    while ( 1 )
    {
      menu();
      read(0, &buf, 4u);
      v3 = atoi(&buf);
      if ( v3 != 1 )
        break;
      printf("What do tou want to say:");
      read_input((int)&echo, 24);
      printf((const char *)&echo);              // 存在格式化字符串漏洞
      puts((const char *)&unk_A97);
    }
  }
  while ( v3 != 2 );
  return 0;
}
printf处有格式化字符串漏洞,可以用来读写堆栈。
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  char buf; // [esp+0h] [ebp-10h]
  unsigned int v6; // [esp+4h] [ebp-Ch]
  int *v7; // [esp+8h] [ebp-8h]

  v7 = &argc;
  v6 = __readgsdword(0x14u);
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  puts("Welcome to kanxue 2019, your pwn like cxk");
  do
  {
    while ( 1 )
    {
      menu();
      read(0, &buf, 4u);
      v3 = atoi(&buf);
      if ( v3 != 1 )
        break;
      printf("What do tou want to say:");
      read_input((int)&echo, 24);
      printf((const char *)&echo);              // 存在格式化字符串漏洞
      puts((const char *)&unk_A97);
    }
  }
  while ( v3 != 2 );
  return 0;
}
printf处有格式化字符串漏洞,可以用来读写堆栈。
用gdb分别在printf(*main+203)和return(*main+264)处下断并查看堆栈。
printf

return


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-6-24 00:57 被梦游枪手编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 499
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
你好~想问下这里的%53$hn这个偏移量是怎么调试出来的呀,我用AAA%x,%x,%x,这样只能泄露前7个数据。
2019-8-26 11:41
0
雪    币: 2155
活跃值: (2592)
能力值: ( LV12,RANK:667 )
在线值:
发帖
回帖
粉丝
3
guyioo- 你好~想问下这里的%53$hn这个偏移量是怎么调试出来的呀,我用AAA%x,%x,%x,这样只能泄露前7个数据。
你可以看上面的截图,sp 0xffffd664的值为0xffffd724,我用0xffffd724来存放欲读写地址,而0xffffd724-0xffffd650=0xD4,也就是距离栈顶53个DWORD,把地址存放到0xffffd724后再用%53$x就能写数据了。
最后于 2019-8-26 19:35 被梦游枪手编辑 ,原因: 口误
2019-8-26 15:25
0
雪    币: 499
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢回复!!
我按照您的方法调试了一下~

这里的话就是 0xffffd064 - 0xffffcf94 = 0xd0 
是52个DWORD呢……
(调试了两次都是这样的说……)
2019-8-26 16:03
0
雪    币: 2155
活跃值: (2592)
能力值: ( LV12,RANK:667 )
在线值:
发帖
回帖
粉丝
5
你看下断点停在哪了,看堆栈的样子是少压了一个值
2019-8-26 17:00
0
雪    币: 499
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
梦游枪手 你看下断点停在哪了,看堆栈的样子是少压了一个值
啊……确实是少压了一个orz,现在是53煤错了~   (之前断点下得太靠前了,
再次感谢您的回复!!
最后于 2019-8-26 17:31 被guyioo-编辑 ,原因:
2019-8-26 17:30
0
雪    币: 2155
活跃值: (2592)
能力值: ( LV12,RANK:667 )
在线值:
发帖
回帖
粉丝
7
guyioo- 梦游枪手 你看下断点停在哪了,看堆栈的样子是少压了一个值 啊……确实是少压了一个orz,现在是53煤错了~  &am ...
上面说错了一点,指正一下,%53$x并不能泄露数据,只能用%53$hn来写,要泄露栈的数据得用%??$x,??是偏移量。
2019-8-26 19:35
0
雪    币: 499
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
梦游枪手 上面说错了一点[em_85],指正一下,%53$x并不能泄露数据,只能用%53$hn来写,要泄露栈的数据得用%??$x,??是偏移量。
欸……为啥 ~   是泄露不了那么多嘛
2019-8-27 08:58
0
雪    币: 2155
活跃值: (2592)
能力值: ( LV12,RANK:667 )
在线值:
发帖
回帖
粉丝
9
%53$x泄露出来的只是存放在栈里面的值。这个值只是个指针,而我们要的东西是指针的值。我不知道怎么读指针的值,不过要读的东西基本都在栈里面,就用%??$x代替了。
最后于 2019-8-28 12:06 被梦游枪手编辑 ,原因:
2019-8-28 12:06
0
雪    币: 499
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
梦游枪手 %53$x泄露出来的只是存放在栈里面的值。这个值只是个指针,而我们要的东西是指针的值。我不知道怎么读指针的值,不过要读的东西基本都在栈里面,就用%??$x代替了。
啊~明白了~  (抱拳感谢!)
最后于 2019-11-25 11:04 被guyioo-编辑 ,原因:
2019-8-29 10:48
0
游客
登录 | 注册 方可回帖
返回
//