第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

Logo

更多推荐