我的pwn筆記


0.64位程序參數一次保存在RDI,RSI,RDX,RCX,R8和 R9,具體見圖

 

windows64位調用約定

 

1.<_libc_csu_init>有一些萬能gadget,匯編如下

#!bash 00000000004005a0 <__libc_csu_init>: 4005a0: 48 89 6c 24 d8          mov    %rbp,-0x28(%rsp) 4005a5: 4c 89 64 24 e0          mov    %r12,-0x20(%rsp) 4005aa: 48 8d 2d 73 08 20 00    lea    0x200873(%rip),%rbp        # 600e24 <__init_array_end> 4005b1: 4c 8d 25 6c 08 20 00    lea    0x20086c(%rip),%r12        # 600e24 <__init_array_end> 4005b8: 4c 89 6c 24 e8          mov    %r13,-0x18(%rsp) 4005bd: 4c 89 74 24 f0          mov    %r14,-0x10(%rsp) 4005c2: 4c 89 7c 24 f8          mov    %r15,-0x8(%rsp) 4005c7: 48 89 5c 24 d0          mov    %rbx,-0x30(%rsp) 4005cc: 48 83 ec 38             sub    $0x38,%rsp 4005d0: 4c 29 e5                sub    %r12,%rbp 4005d3: 41 89 fd                mov    %edi,%r13d 4005d6: 49 89 f6                mov    %rsi,%r14 4005d9: 48 c1 fd 03             sar    $0x3,%rbp 4005dd: 49 89 d7                mov    %rdx,%r15 4005e0: e8 1b fe ff ff callq 400400 <_init> 4005e5: 48 85 ed                test   %rbp,%rbp 4005e8: 74 1c                   je     400606 <__libc_csu_init+0x66> 4005ea: 31 db                   xor    %ebx,%ebx 4005ec: 0f 1f 40 00             nopl   0x0(%rax) 4005f0: 4c 89 fa                mov    %r15,%rdx 4005f3: 4c 89 f6                mov    %r14,%rsi 4005f6: 44 89 ef                mov    %r13d,%edi 4005f9: 41 ff 14 dc             callq  *(%r12,%rbx,8) 4005fd: 48 83 c3 01             add    $0x1,%rbx 400601:   48 39 eb                cmp    %rbp,%rbx 400604:   75 ea                   jne    4005f0 <__libc_csu_init+0x50>
  400606:   48 8b 5c 24 08          mov    0x8(%rsp),%rbx 40060b: 48 8b 6c 24 10          mov    0x10(%rsp),%rbp 400610:   4c 8b 64 24 18          mov    0x18(%rsp),%r12 400615:   4c 8b 6c 24 20          mov    0x20(%rsp),%r13 40061a: 4c 8b 74 24 28          mov    0x28(%rsp),%r14 40061f: 4c 8b 7c 24 30          mov    0x30(%rsp),%r15 400624:   48 83 c4 38             add    $0x38,%rsp 400628:   c3                      retq   

 


2.gcc的編譯選項:
-z -execstack關閉NX
-z -noexecstack開啟NX
-no-pie關閉PIE
-pie開啟PIE  
-g 參數可以用GDB加載時l,b <line>在源代碼第<line>行下斷點
關於canary的幾個編譯選項:
-fstack-protector 啟用保護,不過只為局部變量中含有數組的函數插入保護
-fstack-protector-all 啟用保護,為所有函數插入保護
-fstack-protector-strong 類似windows下GS的一個編譯選項,以下加入canary1)在本地變量地址作為右值表達式或作為函數參數2)本地變量是數組或含數組的union
-fstack-protector-explicit 只對有明確stack_protect attribute的函數開啟保護
-fno-stack-protector 禁用保護

3.readelf -S <filename>查看文件段偏移
readelf -r <filename>查看文件重定位表,.rel.dyn和.rel.plt

4.gdb-peda安裝
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

5.pwndbg安裝
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

6.windbg實用命令

!gflag +hpa  
  這條命令用於定位堆溢出點,hpa=place heap allocations at the end of pages.
sx
  set exceptions。sxe ld:<moudle name>,set exceptions enable when load <moudle name>
windbg dump內存
.writemem <DumpFile_Full_Path> <Dump_Start_Addr> L?<Dump_Length>

 



7.objdump -d -j .plt <filename> 查看<filename>的plt表

objdump -R <filename> 查看<filename>的got表
objdump -M intel -d <filename>  可以查看<filename>bin文件的intel匯編,默認at&t


8.scp -P<port> user@computername:<path> <local_path>下載遠程文件<path>到本地<local_path>


9.cat /proc/[pid]/maps 查看進程加載信息


10.
sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"
關閉系統ASLR
0:沒有隨機化。即關閉 ASLR。
1:保留的隨機化。共享庫、棧、mmap() 以及 VDSO 將被隨機化。
2:完全的隨機化。在 1 的基礎上,通過 brk() 分配的內存空間也將被隨機化。
ASLR並不負責代碼段和數據段的隨機化


11.gdb查找system,'/bin/sh'

print system 查找system函數地址
print __libc_start_main 查找main入口
find <addr of __libc_start_main>,+<offset>,"/bin/sh" 查找"/bin/sh"
官方說明

12.關於RELRO
部分RELRO(由ld -z relro啟用):
  將.got段映射為只讀(但.got.plt還是可以寫)
  重新排列各個段來減少全局變量溢出導致覆蓋代碼段的可能性.
完全RELRO(由ld -z relro -z now啟用)
  執行部分RELRO的所有操作.
  讓鏈接器在鏈接期間(執行程序之前)解析所有的符號, 然后去除.got的寫權限.
  將.got.plt合並到.got段中, 所以.got.plt將不復存在.

13.pwntools加載指定libc啟動
p=process('<process_name>',env={"LD_PRELOAD":"<libc_absolute_path>"})
pwntools帶參數args啟動<proc>
p=process(argv=['./proc',args])

14.

angr安裝:(一定要在mkvirtualenv的虛擬環境下裝,不然本地pwntools會報各種各樣的錯。人生苦短少瞎折騰;b)
apt-get install python-dev libffi-dev build-essential virtualenvwrapper

find / -name virtualenvwrapper.sh    //找到的virtualenvwrapper.sh路徑記為<path>
export WORKON_HOME=~/Envs  //這里最好切到根目錄下
source <path>

創建angr虛擬環境安裝angr(進入虛擬環境后使用pwntools還需在此環境下重新安裝,pip install pwntools)
mkvirtualenv angr && pip install angr


15.手動下載符號表

cmd:<windbg_path>/symchk.exe <target_dll_path> /s SRV*<download_path>*http://msdl.microsoft.com/download/symbols

16.windows下利用管理員權限CMD替換系統DLL
takeown /f <dll_path> icacls <dll_path> /grant administrators:F

 

17.windbg在進程啟動時附加

注冊表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<app>.exe]添加字符串值debugger,value為windbg.exe系統環境變量path添加windbg安裝路徑;或者value值設置為windbg.exe的安裝路徑

 

18.nm -C <filename>  查看<filename>符號表

 

19.apt-get source libc6-dev  下載源碼

grep "<search_target>" -r ./<libc_source_path>/  查找<search_target>在<libc_source_path>的位置

 

20._IO_file

 

struct _IO_FILE {
  int _flags;           /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */
  struct _IO_marker *_markers;
  struct _IO_FILE *_chain;
  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */
#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];
  /*  char* _save_gptr;  char* _save_egptr; */
  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};

struct _IO_FILE_plus
{
  FILE file;    //FILE=_IO_FILE
  const struct _IO_jump_t *vtable;
};

struct _IO_FILE;
/* The opaque type of streams.  This is the definition used elsewhere.  */
typedef struct _IO_FILE FILE;

struct _IO_jump_t
{
    JUMP_FIELD(size_t, __dummy);
    JUMP_FIELD(size_t, __dummy2);
    JUMP_FIELD(_IO_finish_t, __finish);
    JUMP_FIELD(_IO_overflow_t, __overflow);
    JUMP_FIELD(_IO_underflow_t, __underflow);
    JUMP_FIELD(_IO_underflow_t, __uflow);
    JUMP_FIELD(_IO_pbackfail_t, __pbackfail);
    /* showmany */
    JUMP_FIELD(_IO_xsputn_t, __xsputn);
    JUMP_FIELD(_IO_xsgetn_t, __xsgetn);
    JUMP_FIELD(_IO_seekoff_t, __seekoff);
    JUMP_FIELD(_IO_seekpos_t, __seekpos);
    JUMP_FIELD(_IO_setbuf_t, __setbuf);
    JUMP_FIELD(_IO_sync_t, __sync);
    JUMP_FIELD(_IO_doallocate_t, __doallocate);
    JUMP_FIELD(_IO_read_t, __read);
    JUMP_FIELD(_IO_write_t, __write);
    JUMP_FIELD(_IO_seek_t, __seek);
    JUMP_FIELD(_IO_close_t, __close);
    JUMP_FIELD(_IO_stat_t, __stat);
    JUMP_FIELD(_IO_showmanyc_t, __showmanyc);
    JUMP_FIELD(_IO_imbue_t, __imbue);
};

 關於_IO_file的利用:

  p _IO_2_1_stdout_可以找到vtable的地址,然后覆蓋vtable的指針即可改變程序的流程

  p *(struct _IO_jump_t *)<vtable_addr>可以查看vtable的內容

 

21.開啟PIE的程序下相對偏移斷點

pwndbg的一個姿勢(程序運行狀態有效,在需要輸入的位置CTRL+C即可)

b *$rebase(offset)  offset替換為斷點的相對偏移

 

22.ROPgadget --binary <filename> --only "pop|ret" | grep <reg>

過濾<filename>中<reg>的rop gadget

 

23.關於FORTIFY機制

傳送門

按我個人的理解這是緩沖區溢出的緩解措施,這個機制會進行如下操作:

1)在gcc編譯階段使用編譯選項-D_FORTIFY_SOURCE=2(1 或者 2),gcc會檢測到使用strcpy及類似危險函數時未檢查邊界的情況,給出warning

2)對格式化字符串利用的限制,包括參數解析的地址不能位於可讀可寫區域、使用類似%2$x必須使用%1$x

3)對於需要解析地址的函數替換成對應的__*_chk函數

 

24.apt-get

# apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後運行該命令。此外您需要定期運行這一命令以確保您的軟件包列表是最新的。
# apt-get install packagename——安裝一個新軟件包(參見下文的aptitude)
# apt-get remove packagename——卸載一個已安裝的軟件包(保留配置文件)
# apt-get --purge remove packagename——卸載一個已安裝的軟件包(刪除配置文件)
# dpkg --force-all --purge packagename 有些軟件很難卸載,而且還阻止了別的軟件的應用,就可以用這個,不過有點冒險。
# apt-get autoclean apt會把已裝或已卸的軟件都備份在硬盤上,所以如果需要空間的話,可以讓這個命令來刪除你已經刪掉的軟件
# apt-get clean 這個命令會把安裝的軟件的備份也刪除,不過這樣不會影響軟件的使用的。
# apt-get upgrade——更新所有已安裝的軟件包
# apt-get dist-upgrade——將系統升級到新版本
# apt-cache search string——在軟件包列表中搜索字符串
# dpkg -l package-name-pattern——列出所有與模式相匹配的軟件包。如果您不知道軟件包的全名,您可以使用“*package-name-pattern*”。
# aptitude——詳細查看已安裝或可用的軟件包。與apt-get類似,aptitude可以通過命令行方式調用,但僅限於某些命令——最常見的有安裝和卸載命令。由於aptitude比apt-get了解更多信息,可以說它更適合用來進行安裝和卸載。
# apt-cache showpkg pkgs——顯示軟件包信息。
# apt-cache dumpavail——打印可用軟件包列表。
# apt-cache show pkgs——顯示軟件包記錄,類似於dpkg –print-avail。
# apt-cache pkgnames——打印軟件包列表中所有軟件包的名稱。
# dpkg -S file——這個文件屬於哪個已安裝軟件包。
# dpkg -L package——列出軟件包中的所有文件。
# apt-file search filename——查找包含特定文件的軟件包(不一定是已安裝的),這些文件的文件名中含有指定的字符串。apt-file是一個獨立的軟件包。您必須先使用apt-get install來安裝它,然後運行apt-file update。如果apt-file search filename輸出的內容太多,您可以嘗試使用apt-file search filename | grep -w filename(只顯示指定字符串作為完整的單詞出現在其中的那些文件名)或者類似方法,例如:apt-file search filename | grep /bin/(只顯示位於諸如/bin或/usr/bin這些文件夾中的文件,如果您要查找的是某個特定的執行文件的話,這樣做是有幫助的)。
apt-get update 系統軟件包更新

 

25.linux下使用代(敏感詞敏感詞)理

配置小飛機,下載傳送門 

  安裝

dpkg -i xxx
apt-get -f install

  設置成全局代(敏感詞敏感詞)理

設置終端代(敏感詞敏感詞)理,我使用的是privoxy

安裝

apt-get install privoxy

修改/etc/privoxy/config配置

1.搜索字符串去掉listen-address 127.0.0.1:8118 這一句的注釋(#)
2.搜索forward-socks5t,改成forward-socks5t / 127.0.0.1:1080 .
並去掉注釋

修改.bashrc,(路徑~/.bashrc),結尾添加如下配置

export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
export ftp_proxy=http://127.0.0.1:8118

配置修改完畢運行bash即可

 26.本地socat部署pwn環境

socat tcp4-listen:<port>,reuseaddr,fork exec:"env LD_PRELOAD=<libc_path> <execute_file_path>" &

 socat安裝:

wget http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
tar zxf socat-1.7.3.2.tar.gz
cd socat-1.7.3.2
./configure 
make   
make install

 27.在Linux中,值為0、1、2的fd分別代表標准輸入、標准輸出和標准錯誤輸出,在程序中打開文件得到的fd從3開始增長

28.Docker安裝

#!/bin/bash 
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D; 
echo 'deb https://apt.dockerproject.org/repo debian-stretch main' > /etc/apt/sources.list.d/docker.list; 
apt-get install -y apt-transport-https ca-certificates; 
apt-get update && sudo apt-get install -y docker-engine; 
systemctl start docker; 
systemctl enable docker; 
systemctl status docker; 
exit; 
EOF

運行以上腳本

安裝docker-compose

pip install docker-compose

測試安裝(需要注冊docker賬號)傳送門

docker login
docker run hello-world

docker加速

docker網絡問題傳送門

 使用阿里雲docker鏡像加速,獲取加速地址

 
         

阿里:http://mirrors.aliyun.com/help/docker-ce 

清華:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/ 

中科大:http://mirrors.ustc.edu.cn/help/docker-ce.html 

修改/etc/docker/daemon.json(沒有則新建)

{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"dns": ["8.8.8.8","8.8.4.4"]
}

sudo service docker restart

加速細節傳送門

29.記錄一個shellcode編寫時突破字節限制的奇技淫巧

sc=asm('xchg rdi,rsi')
sc+=asm('mov dl,xx')
sc+=asm('syscall')

即通過交換rdi和rsi的值,執行一次sys_read(rdi,xx),這樣匯編之后的shellcode只有7字節(在除rdi外寄存器全部置零的情況下就可以發揮作用了)

30.

ropper github

ropper --file <filename> |grep syscall
尋找<filename>字節碼中的syscall

 31.

pwn使用題目給定的libc動態調試

使用libcdatabase查找所給libc版本

./identify <libc_name>

修改所給elf文件,啟動時使用參數LD_PRELOAD=<libc_name>。pwntools中使用p=process('./<elf>',env={"LD_PRELOAD":"./<libc>"})

patchelf --set-interpreter <libc_ld_path> <elf_name>
LD_PRELOAD
=<libc_name> <elf_name>
或者
patchelf --set-rpath <libc_parent_folder>:/<libc_name> <elf_name>
example:

patchelf --set-rpath /media/sf_pwn_share/ctf-challenges-master/pwn/heap/chunk-extend-shrink/2015_hacklu_bookstore/:/libc.so.6 ./books

注:<libc_ld_name>是libc對應版本的加載程序,可以從這里下載

32.linux方便提高工作效率的一些小命令

find / -name <file-name>    查找名為<filenname>的文件
cat -n <file-name>    <file-name>以帶行數的形式展示
grep "<string>" -r <dir> 在dir目錄查找包含string的文件

 33.afl qemu模式配置的一些坑,隨緣看懂

https://cloud.tencent.com/developer/article/1128539
https://www.cnblogs.com/WangAoBo/p/8280352.html

/usr/include/x86_64-linux-gnu/bits/mman-shared.h
+++static int memfd_create (const char *__name, unsigned int __flags) __THROW;

make install完把afl-fuzz根目錄下的afl-qemu-trace放到whereis afl-fuzz所在目錄下

人生苦短,為什么不選擇apt-get卻偏偏想自己編譯然后因為各種編譯錯誤懷疑人生呢

apt search afl
//找到可用的afl包,我這里是afl++;還有的同學可能是afl包
apt-get install afl++

 34.(WSL真香,啊我死了)wsl管理工具,可以遷移wsl安裝路徑

軟件地址

使用說明

wsl修改為阿里源

sudo vim /etc/apt/sources.list
:%s/security.ubuntu/mirrors.aliyun/g
:%s/archive.ubuntu/mirrors.aliyun/g
:wq

 wsl安裝圖形界面,工具下載地址

(最新版有bug,我這里安裝的是vcxsrv-64.1.20.1.4),配置地址

配置完成之后wsl內輸入

export  DISPLAY=localhost:0
sudo compiz

即可

35.windows+virtualbox雙機調試

36.修改pip源(阿里)

mkdir ~/.pip 
vim ~/.pip/pip.conf

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com

37.標志寄存器

條件標志:反映包含在ALU算術邏輯運算后的結果特征
OF 溢出標志 :運算時,若操作數超出了機器所能表示的范圍為,則產生溢出,OF=1,否則OF=0
SF 符號標志 ;設置成運算操作結果的符號狀態。當結果為負時,SF=1,否則SF=0
ZF 零標志 結果=0,ZF=1,結果≠0,ZF=0
AF 輔助進位標志 ,運算過程中第三位有進位,置AF=1,否則AF=0
PF 奇偶標志: 當操作數中有偶數個1時,置PF=1,否則PF=0
CF進位標志 : 最高有效位產生的進位值,例如 執行加法指令時,MSB有進,置CF=1;否則CF=0

控制標志:控制執行特殊的功能 DF放向標志:用於字符串操作指令程序設計。 DF置0,則串操作控制處理方向,從帶有最低地址的第一個元素逐個處理,否則,從高向低 ID中斷允許標志: IF
=1,CPU允許中斷,IF=0,則CPU關閉中斷 TF跟蹤標志:TF=1,機器進入單步工作方式,每條機器指令執行后,顯示結果及寄存器狀態,若TF=0,則機器處在連續工作方式。此標志為調試機器或調試程序發現故障而設置。

 38.機器碼在0x1f<opcode<=0x7f的匯編指令

1.數據傳送:
push/pop eax…
pusha/popa

2.算術運算:
inc/dec eax…
sub al, 立即數
sub byte ptr [eax… + 立即數], al dl…
sub byte ptr [eax… + 立即數], ah dh…
sub dword ptr [eax… + 立即數], esi edi
sub word ptr [eax… + 立即數], si di
sub al dl…, byte ptr [eax… + 立即數]
sub ah dh…, byte ptr [eax… + 立即數]
sub esi edi, dword ptr [eax… + 立即數]
sub si di, word ptr [eax… + 立即數]

3.邏輯運算:
and al, 立即數
and dword ptr [eax… + 立即數], esi edi
and word ptr [eax… + 立即數], si di
and ah dh…, byte ptr [ecx edx… + 立即數]
and esi edi, dword ptr [eax… + 立即數]
and si di, word ptr [eax… + 立即數]

xor al, 立即數
xor byte ptr [eax… + 立即數], al dl…
xor byte ptr [eax… + 立即數], ah dh…
xor dword ptr [eax… + 立即數], esi edi
xor word ptr [eax… + 立即數], si di
xor al dl…, byte ptr [eax… + 立即數]
xor ah dh…, byte ptr [eax… + 立即數]
xor esi edi, dword ptr [eax… + 立即數]
xor si di, word ptr [eax… + 立即數]

4.比較指令:
cmp al, 立即數
cmp byte ptr [eax… + 立即數], al dl…
cmp byte ptr [eax… + 立即數], ah dh…
cmp dword ptr [eax… + 立即數], esi edi
cmp word ptr [eax… + 立即數], si di
cmp al dl…, byte ptr [eax… + 立即數]
cmp ah dh…, byte ptr [eax… + 立即數]
cmp esi edi, dword ptr [eax… + 立即數]
cmp si di, word ptr [eax… + 立即數]

5.轉移指令:
push 56h
pop eax
cmp al, 43h
jnz lable

<=> jmp lable

6.交換al, ah
push eax
xor ah, byte ptr [esp] // ah ^= al
xor byte ptr [esp], ah // al ^= ah
xor ah, byte ptr [esp] // ah ^= al
pop eax

7.清零:
push 44h
pop eax
sub al, 44h ; eax = 0

push esi
push esp
pop eax
xor [eax], esi ; esi = 0

 39.virtualbox ubuntu訪問共享文件夾

sudo usermod -a -G vboxsf <user_name>
sudo reboot

 40.qemu安裝

sudo apt-get install qemu qemu-system

 41.沒有libc6-dbg符號表libc里尋找main_arena

42.debian ubuntu更新public key不匹配

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com <key>

43.ubuntu chrome安裝

sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub  | sudo apt-key add -
sudo apt-get update
sudo apt-get install google-chrome-stable

 44.linux在當前目錄下查找包含某行代碼的文件

grep -rn "xxx"

r表示遞歸查找

n表示顯示代碼在文件中出現的行號

"xxx"支持正則查詢

45.v8調試

修改gdbinit

sudo gedit ~/.gdbinit

添加v8安裝目錄下tools目錄里的gdbinit路徑

source path/to/gdbinit

加載v8后設置啟動參數

set args --allow-natives-syntax xxx.js

在要調試的xxx.js中設置斷點

%DebugPrint(obj)    // 輸出對象地址
%SystemBreak()      // 觸發調試中斷

gdb中r即可

46.v8拉取舊的commit的時候報錯

Error: 4> 
4> ____ v8/buildtools at xxx
4>     You have unstaged changes.
4>     Please commit, stash, or reset.

解決

gclient sync -f

 47.gdb寫入棧回溯信息到文件

set logging file xxx
set logging on
thread apply all bt
set logging off

 全部調試信息寫入文件,啟動時使用

gdb | tee xxx

 48.

| xxd

以16進制顯示控制台的輸出

49.npm配置代理

修改~/.npmrc文件

proxy=http://127.0.0.1:8123/
https-proxy=http://127.0.0.1:8123
registry=http://registry.npmjs.org/

 50.ubuntu 18.04 fuzzilli JavascriptCore編譯

fuzzilli編譯

git clone https://git.webkit.org/git/WebKit.git WebKit

brew:
sudo apt install linuxbrew-wrapper

icu4c:
brew install icu4c

clang:
sudo apt install clang

gedit bashrc:
export PATH=$PATH:"/home/linuxbrew/.linuxbrew/bin"
export PATH=$PATH:"/home/linuxbrew/.linuxbrew/Cellar/icu4c/66.1"

gedit fuzzbuild.sh

export PATH=$PATH:"/home/linuxbrew/.linuxbrew/Cellar/icu4c/66.1"

 正常編譯

去掉Tools/gtk/install-dependencies里邊installDependenciesWithApt里邊的pipenv包

執行
Tools/gtk/install-dependencies
Tools/Scripts/build-webkit --jsc-only

 切換commit,一例

git checkout -b local_branch_name commit_hash

 編譯Debug帶符號時使用

./Tools/Scripts/build-jsc --jsc-only --debug --cmakeargs="-DENABLE_STATIC_JSC=ON -DCMAKE_C_COMPILER='/usr/bin/clang' -DCMAKE_CXX_COMPILER='/usr/bin/clang++' -DCMAKE_CXX_FLAGS='-fsanitize-coverage=trace-pc-guard -O3 -lrt'"

51.lldb輸入崩潰日志

bugreport unwind --outfile <path/to/logfile>

 52.git 更新本地文件

git fetch --all
git reset --hard origin/master
git pull

 53.linux安裝dotnet

~/.bashrc添加環境變量

export DOTNET_ROOT="/path/to/dotnet/"
export PATH=$PATH:"/path/to/dotnet/"

54.linux添加sudo環境變量路徑

修改~/.bashrc

alias sudo='sudo env PATH=$PATH'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM