challenge2.2:break_at_0x7c00
challenge2.2:break at 0x7c00
在初始化位置0x7c00设置实地址断点,测试断点正常。
同理,直接gdbinit修改断点为0x7c00即可;
$ cat tools/gdbinitfile bin/kerneltarget remote :1234break *0x7c00
执行make debug,看看断点是否正确,能否正常调试;
调试信息如下:
remote Thread 1 In: L?? PC: 0x7c00 0x0000fff0 in ?? ()Breakpoint 1 at 0x7c00(gdb) cContinuing.Breakpoint 1, 0x00007c00 in ?? ()(gdb) x/i $eip=> 0x7c00: cli(gdb)
可以看到断点和调试正常;
challenge2.1:learn_to_use
challenge2.1:learn to use
根据提示,学习一下如何使用gdb下断点调试;
Makefile-lab1mon
到路径/labcodes_answer/lab1_result/中;
执行
make lab1-mon
此时qemu启动,运行后立即暂停,gdb显示相关信息;
0x0000fff0 in ?? ()warning: A handler for the OS ABI "GNU/Linux" is not built into this configurationof GDB. Attempting to continue with the default i8086 settings.The target architecture is assumed to be i8086Breakpoint 1 at 0x7c00Breakpoint 1, 0x00007c00 in ?? ()=> 0x7c00: cli 0x7c01: cld (gdb)
查看Makefile中lab1-mon的信息, ...
asisctf2021_justpwnit
asisctf2021_justpwnit
这次比赛中科院信工所的NeSE战队拿到了第四名的好成绩,借比赛的一道warm up题复习一下stack pivot的知识;
信息收集
chekcsec
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
程序执行
Index: 0Data: helloIndex: 1Data: hiIndex: 2Data: kloseIndex: 3Data: pwn
源码&IDA分析
题目提供了源码,直接对源码进行分析
/* * musl-gcc main.c -o chall -no-pie -fno-stack-protector -O0 -static */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define STR_SIZE 0x8 ...
make.info
make.info
+ cc kern/init/init.cgcc -Ikern/init/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/init/init.c -o obj/kern/init/init.o+ cc kern/libs/stdio.cgcc -Ikern/libs/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/libs/stdio.c -o obj/kern/libs/stdio.o+ cc kern/libs/readline.cgcc -Ikern/libs/ -fno-builtin -Wall -g ...
challenge1.2-standard-MBR
challenge1.2-standard MBR
标准的硬盘主导扇区应符合什么条件?
sign.c
在tools/sign.c中,存在:
// sign.c#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/stat.h>intmain(int argc, char *argv[]) { struct stat st; if (argc != 3) { fprintf(stderr, "Usage: <input filename> <output filename>\n"); return -1; } if (stat(argv[1], &st) != 0) { fprintf(stderr, "Error opening file '%s': %s\n&quo ...
challenge1.1-ucore.img
challenge1.1-ucore.img
ucore.img从何而来?
make
首先在lab1目录中使用以下指令:
make "V=" | tee -a make.info
这样就成功把make "V="的输出信息写入到make.info文件中,方便查看原始命令执行;
Makefile
看一下toobj、totarget、liftf等具体定义,在tools/function.mk中:
toobj
# get .o obj files: (#files[, packet])toobj = $(addprefix $(OBJDIR)$(SLASH)$(if $(2),$(2)$(SLASH)),\ $(addsuffix .o,$(basename $(1))))
todep、totarget
# get .d dependency files: (#files[, packet])todep = $(patsubst %.o,%.d,$(call toobj,$(1),$(2)))totarget = $(addprefix $( ...
目标文件的秘密
目标文件的秘密
编译器编译源代码后生成的文件叫做目标文件,那么目标文件里面存放着什么呢?
从结构上说,是可执行文件的格式,还未经过链接;
目标文件格式
可执行文件、动态链接库和静态链接库都是按照可执行文件格式存储;
目标文件内容
机器指令代码、数据、符号表、调试信息等;
按属性不同以Section的形式存储,基本上不加以区别,除非是在链接和装载的时候;
以下列代码为例:
/************************************************************************* > File Name: hello.c > Author: K1ose > Mail: klose@jk404.cn > Created Time: Tue 16 Nov 2021 09:01:52 AM CST ************************************************************************/#include<stdio.h>int global ...
axb_2019_heap
axb_2019_heap
信息收集
checksec;
跑一下程序;
丢到ida64里分析;
main()函数
int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ int choice; // [rsp+Ch] [rbp-4h] init(); banner(); while ( 1 ) { menu(); choice = get_int(); switch ( choice ) { case 1: add_note(); break; case 2: delete_note(); break; case 3: puts("None!"); break; case 4: edit_note(); break ...
compile与link
编译和链接
如果说“编译和链接这几个字不够熟悉, 那说”Build“就再熟悉不过了吧。
gcc program.c
事实上以上操作涵盖了四个部分:预处理Prepressing、编译compilation、汇编assembly、链接linking;
不为人知的动作
预编译
gcc -E program.c // 生成预编译文件cpp program.c > program.i
预编译主要处理的是源代码文件中以“#”开头的预编译指令;
包括:
将所有“#define”删除,展开所有宏定义;
处理所有条件预编译指令,如#if等;
处理**#include**预编译指令,被包含的文件插入到该预编译指令的位置;
删除所有注释;
添加代码行号和文件名标识,以便于编译时编译器产生调试用的行号信息与用于编译时产生编译错误或警告时能够显示行号;
保留所有**#pragma**编译器指令;
编译
gcc -S program.i -o program.s
编译把预编译处理完的文件进行一系列词法分析、语法分析、语义分析、优化后产生的汇编代码文件;
汇编
gcc -c program.s -o ...
知识储备
知识储备
我就简单写写。 —— K1ose
序言强调了基础的重要性,对数据结构和算法、操作系统、计算机组成原理等大学基础课程要有足够的掌握;
将学到什么
对学习内容有一个初步的认识,清楚了解到能够学习到什么:
Windows和Linux下的可执行文件、目标文件格式(PE、ELF);
普通C/C++代码编译生成目标文件的过程、程序在目标文件中的存储;
目标文件的链接(静态链接、动态链接的详细解读)与可执行文件的生成;
可执行文件的装载与执行;
可执行文件在虚拟空间中的映射;
堆栈与函数调用;
运行库、Glibc和MSVC CRT的分析实现;
系统调用与API;
认识的开始
ANY problem in computer science can be solved by another layer of indirection.
从三个关键硬件部件出发
CPU;
内存;
I/O控制芯片;
I/O:慢吞吞的I/O总线 => PCI/ISA南北桥构架 => AGP、PCI Express等
CPU:频率上的追求(集成密度) => CPU数量(SMP,sym ...