pwnable.tw writeup - tcache tear
checksec
$ checksec tcache_tear
[*] '/home/z1933/workplace/vbshare/ctf/tcache_tear'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x3fe000)
FORTIFY: Enabled
Full RELRO 表示 GOT 表会在程序加载时就填好库函数地址,然后把 GOT 表设置为只读,程序运行时就不能改 GOT 表了。
程序流程还是不难分析的。
double free
Gl...
pwnable.tw writeup - re-alloc
这道题太好了。
程序比较简单,程序流程分析起来比较容易,这里就不赘述了。
有关 malloc,realloc,free,calloc 函数的流程&源码分析可以参考 linux-heap-study。
漏洞函数
释放chunk是通过 rfree 函数调用 realloc(ptr,0) 的形式来进行的。 rfree 之后会把对应的 heap 指针设置为NULL。
分配chunk通过 allocate() 函数调用 realloc(0,size) 的形式来进行的。realloc 会调用malloc进行分配内存。
调整chunk的大小通过 reallocate 函数调用 realloc(ptr,newsize) 的形式来进行的。
rfree 函数,alloc 函数没有找...
pwnable.tw writeup - applestore
主要参考了这篇文章: pwnable.tw - applestore 。
main 函数设置了信号,到时之后程序自动退出,可以把 call _alarm patch 掉。
关键函数
程序没有去符号,分析起来还是比较容易的。
handler 函数:
unsigned int handler()
{
char nptr[22]; // [esp+16h] [ebp-22h] BYREF
unsigned int v2; // [esp+2Ch] [ebp-Ch]
v2 = __readgsdword(0x14u);
while ( 1 )
{
printf("> ");
fflush(stdout);
my_read(np...
pwnable.tw writeup - Silver Bullet
关键函数分析
程序没有金丝雀,smash the stack!
main 函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
int choice; // eax
wolf Werewolf; // [esp+0h] [ebp-3Ch] BYREF
bullet bullet; // [esp+8h] [ebp-34h] BYREF
init_proc();
memset(&bullet, 0, sizeof(bullet));
Werewolf.hp = 2147483647;
Werewolf.name = "Gin";
while ( 1 )
...
pwnable.tw writeup - hacknote
关于 malloc 的首次适配可以参考 how2heap - first_fit:
程序分析
main 函数
void __cdecl __noreturn main()
{
int choice; // eax
char buf[4]; // [esp+8h] [ebp-10h] BYREF
unsigned int v2; // [esp+Ch] [ebp-Ch]
v2 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 2, 0);
while ( 1 )
{
while ( 1 )
{
Printmenu();
re...
pwnable.tw WriteUp - dubblesort
dubblesort
可惜,它给的那个 libc 库用不了,这里先用本地的 libc库 分析。
$ export LD_LIBRARY_PATH="$(pwd)/libc_32.so.6"
ERROR: ld.so: object '/home/z1933/workplace/vbshare/ctf/libc_32.so.6' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
程序分析
用 IDA 对程序逆向分析。
main 函数反编译大概长这样。
int __cdecl main(int argc, const char **argv, const char **en...
pwnable.tw writeup - 3x17
3x17 题目链接
z1933@1933:~/workplace/vbshare/ctf
$ file 3x17
3x17: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=a9f43736cc372b3d1682efa57f19a4d5c70e41d3, stripped
z1933@1933:~/workplace/vbshare/ctf
$ checksec 3x17
[*] '/home/z1933/workplace/vbshare/ctf/3x17'
Arch: amd64-6...
pwnable.tw writeup - calc
calc题目链接
calc
比较好的题。
对程序逆向工程可以看出是一个计算器。
下面是几个关键函数的反编译代码:
main 函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
ssignal(14, timeout);
alarm(60);
puts("=== Welcome to SECPROG calculator ===");
fflush(stdout);
calc();
return puts("Merry Christmas!");
}
主要工作就是调用 calc 函数。 alarm 函数是设置时间发送信号。
calc 函数:
unsigned...
14 post articles, 2 pages.