【HIT-计算机系统】ICS-Lab5 LinkLab
第1章 实验基本信息1.1 实验目的理解链接的作用与工作步骤掌握ELF结构与符号解析与重定位的工作过程熟练使用Linux工具完成ELF分析与修改1.2 实验环境与工具1.2.1 硬件环境x64 CPU;1.60GHz;8G RAM;256GHD Disk。1.2.2 软件环境Windows1064位。1.2.3 开发工具VM VirtualBox6.1;Ubuntu 20.04 LTS 64位;V
第1章 实验基本信息
1.1 实验目的
理解链接的作用与工作步骤
掌握ELF结构与符号解析与重定位的工作过程
熟练使用Linux工具完成ELF分析与修改
1.2 实验环境与工具
1.2.1 硬件环境
x64 CPU;1.60GHz;8G RAM;256GHD Disk。
1.2.2 软件环境
Windows10 64位。
1.2.3 开发工具
VM VirtualBox 6.1;Ubuntu 20.04 LTS 64位;
Visual Studio 2019 64位;CodeBlocks 17.12 64位;vi/vim/gedit+gcc;
edb;gdb。
1.3 实验预习
如第二章
第2章 实验预习
2.1 请按顺序写出ELF格式的可执行目标文件的各类信息(5分)
2.2请按照内存地址从低到高的顺序,写出Linux下X64内存映像。(5分)
2.3请运行“LinkAddress -u 学号 姓名” 按地址循序写出各符号的地址、空间。并按照Linux下X64内存映像标出其所属各区。
(5分)
所属区 | 符号及地址(地址从小到大)和空间(上下差值为上一个符号的空间) |
只读代码段(.init,.text,.rodata) 只读,格式串、程序代码等 | useless 0x401186 4198790 main 0x4011af 4198831 exit 0x401090 4198544 printf 0x401060 4198496 malloc 0x401070 4198512 free 0x401030 4198448 strcpy 0x401040 4198464 |
读/写段(.data,.bss) 可更改,未初始化和初始化的全局变量和静态变量等数据 | big array 0x40404140 1077952832 huge array 0x404140 4211008 global 0x404110 4210960 gint0 0x40412c 4210988 glong 0x404108 4210952 cstr 0x4040a0 4210848 pstr 0x4021e8 4202984 gc 0x402284 4203140 cc 0x402220 4203040 |
运行时堆(由malloc创建) 由malloc分配的连续内存 | p1 0x7f86c94f2010 140216879751184 p2 0x431f46b0 1126123184 p3 0x7f86c94d1010 140216879616016 p4 0x7f86894d0010 140215805870096 p5 0x7f86094cf010 140213658382352 |
用户栈(运行时创建) 局部变量等,指针env指向环境变量environ,栈中env[0]向上直到null为止都为指向环境变量字符串的指针 | local int 0 0x7ffc858c9eac 140722549071532 local int 1 0x7ffc858c9ea8 140722549071528 local static int 0 0x404130 4210992 local static int 1 0x404080 4210816 local astr 0x7ffc858c9ab0 140722549070512 local pstr 0x402170 4202864 argc 0x7ffc858c9aac 140722549070508 argv 0x7ffc858c9fd8 140722549071832 argv[0] 7ffc858cb376 argv[1] 7ffc858cb384 argv[2] 7ffc858cb387 argv[3] 7ffc858cb392 argv[0] 0x7ffc858cb376 140722549076854 argv[1] 0x7ffc858cb384 140722549076868 argv[2] 0x7ffc858cb387 140722549076871 argv[3] 0x7ffc858cb392 140722549076882 env 0x7ffc858ca000 140722549071872 env[0] *env 0x7ffc858cb39c 140722549076892 SHELL=/bin/bash env[1] *env 0x7ffc858cb3ac 140722549076908 SESSION_MANAGER=local/cdx1190201308-VirtualBox:@/tmp/.ICE-unix/1593,unix/cdx1190201308-VirtualBox:/tmp/.ICE-unix/1593 env[2] *env 0x7ffc858cb422 140722549077026 QT_ACCESSIBILITY=1 env[3] *env 0x7ffc858cb435 140722549077045 COLORTERM=truecolor env[4] *env 0x7ffc858cb449 140722549077065 XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg env[5] *env 0x7ffc858cb476 140722549077110 XDG_MENU_PREFIX=gnome- env[6] *env 0x7ffc858cb48d 140722549077133 GNOME_DESKTOP_SESSION_ID=this-is-deprecated env[7] *env 0x7ffc858cb4b9 140722549077177 LANGUAGE=zh_CN:zh env[8] *env 0x7ffc858cb4cb 140722549077195 GNOME_SHELL_SESSION_MODE=ubuntu env[9] *env 0x7ffc858cb4eb 140722549077227 SSH_AUTH_SOCK=/run/user/1000/keyring/ssh env[10] *env 0x7ffc858cb514 140722549077268 XMODIFIERS=@im=ibus env[11] *env 0x7ffc858cb528 140722549077288 DESKTOP_SESSION=ubuntu env[12] *env 0x7ffc858cb53f 140722549077311 SSH_AGENT_PID=1545 env[13] *env 0x7ffc858cb552 140722549077330 GTK_MODULES=gail:atk-bridge env[14] *env 0x7ffc858cb56e 140722549077358 DBUS_STARTER_BUS_TYPE=session env[15] *env 0x7ffc858cb58c 140722549077388 PWD=/home/cdx1190201308/Hitics/linklab env[16] *env 0x7ffc858cb5b3 140722549077427 LOGNAME=cdx1190201308 env[17] *env 0x7ffc858cb5c9 140722549077449 XDG_SESSION_DESKTOP=ubuntu env[18] *env 0x7ffc858cb5e4 140722549077476 XDG_SESSION_TYPE=x11 env[19] *env 0x7ffc858cb5f9 140722549077497 GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1 env[20] *env 0x7ffc858cb62d 140722549077549 XAUTHORITY=/run/user/1000/gdm/Xauthority env[21] *env 0x7ffc858cb656 140722549077590 WINDOWPATH=2 env[22] *env 0x7ffc858cb663 140722549077603 HOME=/home/cdx1190201308 env[23] *env 0x7ffc858cb67c 140722549077628 USERNAME=cdx1190201308 env[24] *env 0x7ffc858cb693 140722549077651 IM_CONFIG_PHASE=1 env[25] *env 0x7ffc858cb6a5 140722549077669 LANG=zh_CN.UTF-8 env[26] *env 0x7ffc858cb6b6 140722549077686 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: env[27] *env 0x7ffc858cbc98 140722549079192 XDG_CURRENT_DESKTOP=ubuntu:GNOME env[28] *env 0x7ffc858cbcb9 140722549079225 VTE_VERSION=6003 env[29] *env 0x7ffc858cbcca 140722549079242 GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/0bf202d0_a252_4312_ad2e_5b02244f2ecd env[30] *env 0x7ffc858cbd20 140722549079328 INVOCATION_ID=e8f20c740b2b4fa5a6390f30bd0c6aa3 env[31] *env 0x7ffc858cbd4f 140722549079375 MANAGERPID=1327 env[32] *env 0x7ffc858cbd5f 140722549079391 LESSCLOSE=/usr/bin/lesspipe %s %s env[33] *env 0x7ffc858cbd81 140722549079425 XDG_SESSION_CLASS=user env[34] *env 0x7ffc858cbd98 140722549079448 TERM=xterm-256color env[35] *env 0x7ffc858cbdac 140722549079468 LESSOPEN=| /usr/bin/lesspipe %s env[36] *env 0x7ffc858cbdcc 140722549079500 USER=cdx1190201308 env[37] *env 0x7ffc858cbddf 140722549079519 GNOME_TERMINAL_SERVICE=:1.71 env[38] *env 0x7ffc858cbdfc 140722549079548 DISPLAY=:0 env[39] *env 0x7ffc858cbe07 140722549079559 SHLVL=1 env[40] *env 0x7ffc858cbe0f 140722549079567 QT_IM_MODULE=ibus env[41] *env 0x7ffc858cbe21 140722549079585 DBUS_STARTER_ADDRESS=unix:path=/run/user/1000/bus,guid=dcc366371e27d0100b95123560a86753 env[42] *env 0x7ffc858cbe79 140722549079673 XDG_RUNTIME_DIR=/run/user/1000 env[43] *env 0x7ffc858cbe98 140722549079704 JOURNAL_STREAM=8:34342 env[44] *env 0x7ffc858cbeaf 140722549079727 XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop env[45] *env 0x7ffc858cbf04 140722549079812 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin env[46] *env 0x7ffc858cbf6c 140722549079916 GDMSESSION=ubuntu env[47] *env 0x7ffc858cbf7e 140722549079934 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus,guid=dcc366371e27d0100b95123560a86753 env[48] *env 0x7ffc858cbfda 140722549080026 _=./linkaddress |
2.4请按顺序写出LinkAddress从开始执行到main前/后执行的子程序的名字。(gcc与objdump/GDB/EDB)(5分)
gdb中为程序中所有函数加上断点:
r开始调试,观察 main前后执行的所有函数
main前 | Breakpoint 11, 0x00007ffff7fd00a0 in malloc@plt () from /lib64/ld-linux-x86-64.so.2 Breakpoint 10, 0x00007ffff7fec490 in malloc () from /lib64/ld-linux-x86-64.so.2 Breakpoint 4, _init (argc=4, argv=0x7fffffffdff8, envp=0x7fffffffe020) at init-first.c:52 Breakpoint 14, 0x00000000004010a0 in _start () Breakpoint 20, 0x0000000000401640 in __libc_csu_init () Breakpoint 19, 0x0000000000401180 in frame_dummy () Breakpoint 17, 0x0000000000401110 in register_tm_clones () |
main后 | Breakpoint 1, main (argc=4, argv=0x7fffffffdff8) at HITCSF-LAB5-linkaddress.c:25 Breakpoint 3, show_pointer (p=p@entry=0x7fffffffe020, descr=descr@entry=0x402035 "env") at HITCSF-LAB5-linkaddress.c:19 Breakpoint 8, printf (__fmt=0x402004 "%s\t%p\t%lu\n") at /usr/include/x86_64-linux-gnu/bits/stdio2.h:10 Breakpoint 12, 0x0000000000401080 in __printf_chk@plt () Breakpoint 11, 0x00007ffff7de6310 in malloc@plt () from /lib/x86_64-linux-gnu/libc.so.6 Breakpoint 7, 0x0000000000401050 in puts@plt () Breakpoint 10, __GI___libc_malloc (bytes=268435456) at malloc.c:3023 Breakpoint 5, 0x0000000000401030 in free@plt () Breakpoint 18, 0x0000000000401150 in __do_global_dtors_aux () Breakpoint 16, 0x00000000004010e0 in deregister_tm_clones () Breakpoint 22, 0x00000000004016b8 in _fini () |
第3章 各阶段的原理与方法
每阶段40分,phasex.o 20分,分析20分,总分不超过80分
3.1 阶段1的分析
程序运行结果截图:
分析与设计的过程:
将main.o与phase1.o链接后运行得到乱码,反汇编可执行程序phase1:
可见程序调用了puts输出字符串,但未知该字符串信息,则为了查看该字符串所在位置,对phase1.o进行反汇编:
观察phase1.o的反汇编代码,在.text节代码第9有需要重定位的地方,其在.data节偏移0x4a位置,则可知该位置存放输出的字符串,我们需要将该位置的字符串更改为目标字符串。
使用readelf查看phase1.o的节头信息,得到.data在phase.o的0x60位置,则该输出的字节信息在0x60+0x4a=0xaa位置:
使用hexedit找到该位置,然后将该位置直接信息改为目标字符串XXXXXXXXXX(十位学号ID),对应ASCII码为3X 3X 3X 3X 3X 3X 3X 3X 3X 3X(与学号XXXXXXXXXX各位一一对应),结尾补上00:
寻找位置0xaa:
替换为3X 3X 3X 3X 3X 3X 3X 3X 3X 3X 00:
再进行链接,输出为目标字符串:
3.2 阶段2的分析
程序运行结果截图:
分析与设计的过程:
对main.o和phase2.o进行链接并执行,发现程序不做任何动作。
为了探究原因反汇编phase2.o:
观察发现phase2.o的反汇编代码中存在大量nop,该指令令程序不做动作,我们需要将nop指令改为其他机器指令令其输出我们的目标信息。
而反汇编代码中还有一个函数GgYIDGgJ,其有调用puts的部分,可使用该函数借用其中的puts输出目标字符串。
观察可知,在该函数中有三处需要重定位的地方,一处在.rodata节位置,而查看phase2.o的.rodata节发现其中储存的是目标字符串(见下图),而test %eax,%eax后函数返回退出,推测比较输入字符串是否是目标字符串,若相等则输出该串,否则跳过puts。于是为了可执行程序能够输出字符串,我们需要让链接后的do_phase能使用正确的参数(令strcmp两个参数都为目标字符串)调用GgYIDGgJ。
为此我们需要让参数指向.rodata,然后调用该函数。
首先gdb进入phase2查看函数起始地址:
在函数开头,程序将%rdi赋给了%rbp-0x8和%rax,可知%rax得到的是参数%rdi的值(参数值);又将0x40207c赋给了%esi,查看%esi得其储存的是目标字符串,即重定位得到.rodata的地址(phase2.o反汇编中%esi赋值为0x0,没有定位)
编写汇编代码p2.s,将.rodata的地址传给%rdi,在函数内通过%rdi传给%rax,调用函数strcmp。
于是我们编写汇编代码,令%rdi作为参数指向目标字符串,然后调用GgYIDGgJ:
编译及反汇编得到机器指令:
使用hexedit将机器指令覆盖phase2.o的nop(90)处指令:
链接得到可执行文件,执行得:
3.3 阶段3的分析
程序运行结果截图:
分析与设计的过程:
链接main.o与phase3.o,输出空字符串
使用gdb在do_phase设置断点查看,得到如下循环:
由-0x13(%rbp,%rax,1)可知,%rbp-0x13是字符串基址,而%rax是i
查看-0x13(%rbp)得到字符串COOKIE
movzbl %la,%eax表示取%eax低1字节,后续操作%rax加上0x404080,然后再取低1字节,输出。0x404080疑似PHASE3_CODEBOOK地址,以COOKIE的char类型ASCII码值为下标取字符输出。(COOKIE的各位符号ASCII码分别为98 106 100 108 121 105 104 110 107 118)
只需将PHASE3_CODEBOOK对应下标位置改为“XXXXXXXXXX”(十位学号ID)对应的数字字符。
查看符号表:
可得PHASE3_CODEBOOK为UwWuJdhJX,大小为256。
于是我们可以编写代码(PHASE3_CODEBOOK对应下标位置改为“XXXXXXXXXX”(十位学号ID)对应的数字字符,其余位随意填充,但注意下标从0开始):
将.c汇编为.o文件后与其余两个链接,执行:
3.4 阶段4的分析
程序运行结果截图:
分析与设计的过程:
3.5 阶段5的分析
程序运行结果截图:
分析与设计的过程:
代码、附件github地址
https://github.com/ChenDolph7in/HITICS-LABS-in-21-Spring/tree/master/Lab5
更多推荐
所有评论(0)