vimrc 紹介

" All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by
" the call to :runtime you can find below. If you wish to change any of those
" settings, you should do it in this file (/etc/vim/vimrc), since debian.vim
" will be overwritten everytime an upgrade of the vim packages is performed.
" It is recommended to make changes after sourcing debian.vim since it alters
" the value of the 'compatible' option.

" This line should not be removed as it ensures that various options are
" properly set to work with the Vim-related packages available in Debian.
runtime! debian.vim

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
"set compatible

" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
if has("syntax")
syntax on
endif

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
"set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
"if has("autocmd")
" au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"endif

" Uncomment the following to have Vim load indentation rules and plugins
" according to the detected filetype.
"if has("autocmd")
" filetype plugin indent on
"endif

" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.
"set showcmd " Show (partial) command in status line.
"set showmatch " Show matching brackets.
"set ignorecase " Do case insensitive matching
"set smartcase " Do smart case matching
"set incsearch " Incremental search
"set autowrite " Automatically save before commands like :next and :make
"set hidden " Hide buffers when they are abandoned
"set mouse=a " Enable mouse usage (all modes)

" Source a global configuration file if available
if filereadable("/etc/vim/vimrc.local")
source /etc/vim/vimrc.local
endif


" add by me

" set number
"set number

" :vim <str> %
nnoremap [q :cprevious<CR> " 前へ
nnoremap ]q :cnext<CR> " 次へ
nnoremap [Q :<C-u>cfirst<CR> " 最初へ
nnoremap ]Q :<C-u>clast<CR> " 最後へ

" vim -b
augroup BinaryXXD
autocmd!
autocmd BufReadPre *.bin let &binary =1
autocmd BufReadPost * if &binary | silent %!xxd -g 1
autocmd BufReadPost * set ft=xxd | endif
"autocmd BufWritePre * if excute "%!xxd -r" | endif
autocmd BufWritePost * if &binary | silent %!xxd -g 1
autocmd BufWritePost * set nomod | endif
augroup END

" ビジュアルモードで選択したテキストが、クリップボードに入るようにする
" http://nanasi.jp/articles/howto/editing/clipboard.html
" set clipboard=autoselect

" 無名レジスタに入るデータを、*レジスタにも入れる。
" set clipboard+=unnamed
set clipboard=unnamedplus

"add by me

" setting
"文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd

" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示(縦)
set cursorcolumn
" 行末の1文字先までカーソルを移動できるように
set virtualedit=block
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
"set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk

" Tab系
" 不可視文字を可視化(タブが「▸-」と表示される)
"set list listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%
" Tab文字を半角スペースにする
"set expandtab
" 行頭以外のTab文字の表示幅(スペースいくつ分)
set tabstop=4
" 行頭でのTab文字の表示幅
set shiftwidth=4


" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
" カーソルの回り込みができるようになる
set whichwrap=b,s,[,],<,>
"バックスペースを、空白、行末、行頭でも使えるようにする
set backspace=indent,eol,start

let mapleader = "\<Space>"
nnoremap <Leader>w :w<CR>
nnoremap <Leader>b :%!xxd -r<CR>

inoremap <C-u> "
inoremap <C-o> '
inoremap <C-p> -
inoremap <C-c> <pre>
inoremap <C-v> </pre>

" ---- dvorak ----
"noremap h gj
"noremap t gk
"noremap d <left>
"noremap n <right>
"inoremap <C-g> <left>
"inoremap <C-c> <right>
"inoremap <C-e> <up>
"inoremap <C-u> <down>
"inoremap <C-w> <esc>
"noremap \ n
"noremap q d
" ---- dvorak ----

" ---- jp ----
noremap j gj
noremap k gk
inoremap <C-h> <left>
inoremap <C-l> <right>
vnoremap <C-l> <right>
noremap <C-l> <right>
inoremap <C-k> <up>
"inoremap <C-j> <down>
inoremap <C-j> <esc>
inoremap <C-x> <esc>
" ---- jp ----

highlight CursorColumn ctermbg=Black
"highlight CursorLine ctermbg=Black

" neobundle settings {{{
if has('vim_starting')
set nocompatible
" neobundle をインストールしていない場合は自動インストー
if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
echo "install neobundle..."
" vim からコマンド呼び出しているだけ neobundle.vim のクローン
:call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
endif
" runtimepath の追加は必須
set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'

" neobundle#begin - neobundle#end の間に導入するプラグインを記載します。
NeoBundleFetch 'Shougo/neobundle.vim'
" ↓こんな感じが基本の書き方
NeoBundle 'nanotech/jellybeans.vim'
"NeoBundle 'tpope/vim-surround'
NeoBundle 'vim-scripts/sudo.vim'
NeoBundle 'Shougo/vimproc', {
\ 'build' : {
\ 'windows' : 'make -f make_mingw32.mak',
\ 'cygwin' : 'make -f make_cygwin.mak',
\ 'mac' : 'make -f make_mac.mak',
\ 'unix' : 'make -f make_unix.mak',
\ },
\ }
if has('lua')
NeoBundleLazy 'Shougo/neocomplete.vim', {
\ 'depends' : 'Shougo/vimproc',
\ 'autoload' : { 'insert' : 1,}
\ }
endif
" neocomplete {{{
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#auto_completion_start_length = 3
let g:neocomplete#enable_ignore_case = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#enable_camel_case = 1
let g:neocomplete#use_vimproc = 1
let g:neocomplete#sources#buffer#cache_limit_size = 1000000
let g:neocomplete#sources#tags#cache_limit_size = 30000000
let g:neocomplete#enable_fuzzy_completion = 1
let g:neocomplete#lock_buffer_name_pattern = '\*ku\*'
" " }}}
NeoBundleLazy 'Shougo/vimshell', {
\ 'depends' : 'Shougo/vimproc',
\ 'autoload' : {
\ 'commands' : [{ 'name' : 'VimShell', 'complete' : 'customlist,vimshell#complete'},
\ 'VimShellExecute', 'VimShellInteractive',
\ 'VimShellTerminal', 'VimShellPop'],
\ 'mappings' : ['<Plug>(vimshell_switch)']
\ }}

" vimshell {{{
nmap <silent> vs :<C-u>VimShell<CR>
nmap <silent> vp :<C-u>VimShellPop<CR>
" }}}
NeoBundle 'LeafCage/yankround.vim'
" yankround.vim {{{
nmap p <Plug>(yankround-p)
nmap P <Plug>(yankround-P)
nmap <C-p> <Plug>(yankround-prev)
nmap <C-n> <Plug>(yankround-next)
let g:yankround_max_history = 100
nnoremap <Leader><C-p> :<C-u>Unite yankround<CR>
"}}}
NeoBundle 'Townk/vim-autoclose'
NeoBundle 'glidenote/memolist.vim'
" memolist {{{
let g:memolist_path = expand('~/memolist')
let g:memolist_gfixgrep = 1
let g:memolist_unite = 1
let g:memolist_unite_option = "-vertical -start-insert"
nnoremap mn :MemoNew<CR>
nnoremap ml :MemoList<CR>
nnoremap mg :MemoGrep<CR>
" }}}

NeoBundle 'Lokaltog/vim-easymotion'
" vim-easymotion {{{
let g:EasyMotion_do_mapping = 0
nmap s <Plug>(easymotion-s2)
xmap s <Plug>(easymotion-s2)
omap z <Plug>(easymotion-s2)
nmap g/ <Plug>(easymotion-sn)
xmap g/ <Plug>(easymotion-sn)
omap g/ <Plug>(easymotion-tn)
let g:EasyMotion_smartcase = 1
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
let g:EasyMotion_startofline = 0
" let g:EasyMotion_keys = 'QZASDFGHJKL;'
let g:EasyMotion_keys = 'Q1Z2A3S4D5F6G7H8J9K/;'
let g:EasyMotion_use_upper = 1
let g:EasyMotion_enter_jump_first = 1
" }}}
NeoBundleLazy 'junegunn/vim-easy-align', {
\ 'autoload': {
\ 'commands' : ['EasyAlign'],
\ 'mappings' : ['<Plug>(EasyAlign)'],
\ }}
" vim-easy-align {{{
vmap <Enter> <Plug>(EasyAlign)
nmap <Leader>a <Plug>(EasyAlign)
" }}}
NeoBundleLazy 'Shougo/neosnippet', {
\ 'depends' : 'Shougo/neosnippet-snippets',
\ 'autoload' : {
\ 'insert' : 1,
\ 'filetypes' : 'snippet',
\ }}
NeoBundle 'Shougo/neosnippet-snippets'
let g:neosnippet#data_directory = expand('~/.vim/etc/.cache/neosnippet')
let g:neosnippet#snippets_directory = [expand('~/.vim/.bundle/neosnippet-snippets/neosnippets'),expand('~/dotfiles/snippets')]
" neosnippet {{{
imap <C-t> <Plug>(neosnippet_expand_or_jump)
smap <C-t> <Plug>(neosnippet_expand_or_jump)
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
" }}}
NeoBundle 'vim-scripts/matchit.zip'
NeoBundleLazy 'thinca/vim-quickrun', {
\ 'autoload' : {
\ 'mappings' : 'n', '\r',
\ 'commands' : ['QuickRun']
\ }}
" quickrun {{{
let g:quickrun_config = {}
let g:quickrun_config._ = { 'runner' : 'vimproc',
\ 'runner/vimproc/updatetime' : 200,
\ 'outputter/buffer/split' : ':botright 8sp',
\ 'outputter' : 'multi:buffer:quickfix',
\ 'hook/close_buffer/enable_empty_data' : 1,
\ 'hook/close_buffer/enable_failure' : 1,
\ }
nnoremap <expr><silent> <C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "\<C-c>"
" }}} }
NeoBundleLazy 'mattn/emmet-vim', {
\ 'autoload' : {
\ 'filetypes' : ['html', 'html5', 'eruby', 'jsp', 'xml', 'css', 'scss', 'coffee'],
\ 'commands' : ['<Plug>ZenCodingExpandNormal']
\ }}
" emmet {{{
let g:use_emmet_complete_tag = 1
let g:user_emmet_settings = {
\ 'lang' : 'ja',
\ 'html' : {
\ 'indentation' : ' '
\ }}
" }}}

 

" vimrc に記述されたプラグインでインストールされていないものがないかチェックする
NeoBundleCheck
call neobundle#end()
filetype plugin indent on
" どうせだから jellybeans カラースキーマを使ってみましょう
set t_Co=256
syntax on
colorscheme jellybeans

 

radare2 コマンド一覧

  1. #実行  
  2. r2 -d a.out  
  3. r2 -d a.out 100 hoge fugafuga  
  4.   
  5. #解析  
  6. aaa  
  7.   
  8. #進数変換/計算  
  9. ? [expr]  
  10.   
  11. #関数列挙  
  12. afl  
  13.   
  14. #imports  
  15. iiq  
  16.   
  17. #Exports  
  18. iEq  
  19.   
  20. #symbols  
  21. isq  
  22.   
  23. #sections  
  24. iSq  
  25.   
  26. #reloc  
  27. irq  
  28.   
  29. #strings  
  30. izq  
  31.   
  32. #xref  
  33. ax [addr] (このアドレスを指すポインタ検索)  
  34. axt [addr] (addrを参照するデータの検索)  
  35. axf [addr] (addrから参照されるデータの検索)  
  36. (ex)  
  37. axf [.text_addr] (.text_addrを使うaddrの検索)  
  38. axf sym.imp.printf (printfが参照されてるaddrの検索)  
  39. axt sym.imp.printf (printfを参照してるaddrの検索)  
  40. axf str.Enter_the_password (  
  41. axt str.Enter_the_password (str.Enter_the_passwordを参照するaddrの検索)  
  42.   
  43. #メモリ上書き  
  44. #シークしてるところで(下)  
  45. wa jmp eax (機械語生成)  
  46. 'hello'  (文字列生成)  
  47. wx 90 90 90 90 (バイト生成)  
  48. wf tmp.bin (ファイルからインポート)  
  49.   
  50. #registers  
  51. dr  
  52.   
  53. #memory map/vmmap  
  54. dm,dmq  
  55.   
  56. #シンボル  
  57. dmi  
  58.   
  59. #現在のシンボル  
  60. dmi.  
  61.   
  62. #ヒープ情報  
  63. dmh  
  64.   
  65. #バックトレース  
  66. dbt  
  67.   
  68. #p system  
  69. dmi* libc system  
  70.   
  71. #レジスタ  
  72. dr / dr [register]  
  73.   
  74. #前のレジスタ  
  75. dro  
  76.   
  77. #レジスタ書き換え  
  78. dr eax=0xhoge  
  79.   
  80. #seek(見たいアドレス位置の変更)  
  81. s [addr]  
  82.   
  83. #seekをひとつ進める  
  84. s++  
  85.   
  86. #seekをひとつ戻す  
  87. s--  
  88.   
  89. #seekを進める(?)  
  90. s >> (?)  
  91.   
  92. #seekされている位置からの逆アセンブル  
  93. pd [num]  
  94.   
  95. #関数の逆アセンブル  
  96. pdf  
  97. pdf @関数名  
  98.   
  99. #checksec  
  100. iI  
  101.   
  102.   
  103. #break point  
  104. db [addr]  
  105.   
  106. #step into  
  107. ds  
  108. ds [num]  
  109.   
  110. #step over  
  111. dso  
  112. dso [num]  
  113.   
  114. #back  
  115. dsb  
  116.   
  117. #フレームの終わりまでステップ  
  118. dsf  
  119.   
  120. #snapshot系(?)  
  121. dms(?)  
  122.   
  123. #step until addr  
  124. dcu [addr] / dsu [addr]  
  125.   
  126. #callまでステップ  
  127. dsui call / dcui call(?)未確認  
  128.   
  129. #visual mode  
  130. V  
  131.   
  132. #graphic mode  
  133. VV  
  134.   
  135. #mode change (visual/graphic)  
  136. p  
  137.   
  138. #step into (visual/graphic)  
  139. s  
  140.   
  141. #step over (visual/graphic)  
  142. S  
  143.   
  144. #functions menu (visual/graphic)  
  145. v  
  146. (Usage command)  
  147. m: function name edit  
  148. x: xref(crr_seekのみ)  
  149.   
  150. #メモリ解析  
  151. #基本  
  152. pf [解析数][option] [addr]  
  153. (Usage Options)  
  154. i: int  
  155. b: 1byte  
  156. c: char  
  157. w: 2byte  
  158. x: 4byte  
  159. q: 8byte  
  160. p: pointer  
  161. s: 4byte strings  
  162. S: 8byte strings  
  163. z: nullまで(4byte_addr)  
  164. Z: nullまで(8byte_addr)  
  165. D: disass  
  166. (ex) pf x 0xaaaabbbb  
  167. (ex) pf 3x @0xaaaabbbb  
  168. (ex) pf 10s @esp <- 神  
  169. (ex) pf 10xs @esp  
  170.   
  171. #バイナリ表示  
  172. px[option] [addr]  
  173. (Usage Options)  
  174. default: hexdump  
  175. w: 4byteのpx  
  176. q: 8byteのpx  
  177.   
  178. #文字列表示  
  179. ps[option] [addr]  
  180. (Usage Options)  
  181. default: 機械語で表示)  
  182. b: めちゃ有能  
  183. i: 文字化けで表示  
  184. x: ストリームで表示  
  185. u: psxのutf16.ver  
  186. z: nullまで  
  187.   
  188. #検索系  
  189. /: 検索  
  190. /c: asm検索 (jmp eax)?  
  191. /a: asm検索 (jmp eax)?  
  192. /A: asm検索(jmp)  
  193.   
  194. ieq: エントリーポイント  
  195.   
  196. #r2 -w: よくわからん  
  197.   
  198. #r2 -n  
  199. p=e よくわからんけど色のゲージ  
  200.   
  201. #rabin2(未整形)  
  202. -qe エントリーポイント?  
  203. -qs [file] シンボル?  
  204. -qi   
  205. -qR  
  206.   
  207. #その他  
  208. s eip (現在の位置)  
  209. ood (-dで開き直す)  
  210. ood AAAAAAAAAAAAAAAAA....  
  211. pm マジック  
  212. pc (byte)  
  213. pcp (pcのつよいばん?)  
  214. pB バイナリ  
  215. R 色変え  
  216.   
  217. narnia2(ウェブ)  

C言語のリファレンスの読み方

C言語は、ポインタ周りを深く理解していないと、リファレンスを読むことすらできません。
今回は、その解説を行っていきたいと思います。
問題のページは、こちら
この中から

int execvp(const char *file, char *const argv[]);  

について解説して行きたいと思います。

  • 定石その1 : constは無視
    constというのは、そのまま「静的な」という意味なのですが、これは、定数宣言の時にも用いられ、ここでは、「関数内で書き換えられることはありませんよ」ということを僕らに教えてくれてるだけなのです。なので、このconstについては意識しなくても、リファレンスの理解は十分可能です。
    すると、こうなります。
int execvp(char *file, char * argv[]);
  • 定石その2 : あすたりすくの位置
    ポインタを表す「*」という記号ですが、これは、変数から離しましょう。
    すると、こうなります。
int execvp(char* file, char* argv[]);
  • 定石その3 : そのまま変数に定義されている型のデータを入れる
    char*型とは、1byteの部屋をもったポインタ型のことです。
    つまり、file変数にはアドレス1(以降p0)があり、そのp0は1byte分の広さがあるということで、
    argv[]配列の中には、それぞれアドレス1,アドレス2,アドレス3,,,(以降p0,p1,p2)があり、それぞれ1byte分の広さがあるということです。

以上の定石3つを適応させると、こうなります。

char *args = {"sh", NULL};
execvp(args[0], args);

char *argsでargsという1byte分の部屋を持つアドレス専用の変数を用意します。
その変数を配列として、{“sh”, NULL}を入れます。
こうすることで、args[0]->p0->“sh”, args[1]->p1->NULLとなります。
これがすんなりわからない方は、普通のポインタ型宣言を思い出すと良いでしょう。
char *pHoge = “hogehoge”;
これは、pHogeという1byteの部屋をもつポインタ変数を用意します。
そのあと、そこに"hogehoge"というデータをもつ先頭番地をpHogeに格納します。(ポインタ型変数宣言時に代入する場合はアドレスでなければならないので、本来はキャストが必要。しかし、警告がでるだけで自動キャストが行われる。)
すると、pHogeにはアドレスが格納され、*pHogeはそのアドレスの中身が格納されます。
この時の"hogehoge"を{“hoge”,“fuga”}という配列の形にすることで、pHogeにはその配列の先頭番地が格納され、*pHogeの中にはその配列の先頭要素が格納されることになります。
つまり、結果的にchar *args = {“sh”, NULL};でargs[0]には"sh"が格納されたアドレス、args[1]にはNULLが格納されたアドレス、argsには配列の先頭番地が格納されることになります。
そのあとにexecvp(args[0], args);でexecvp(“sh"が格納されたアドレス, {"sh"が格納されたアドレスが格納されたアドレス,NULL}); となり、定石3の形と同じにすることができました。
これを実際のメモリ的に考えると、

...  
p0 --> 0x12345678 --> "sh"  
...  
p1+0 --> 0x78  
p1+1 --> 0x56  
p1+2 --> 0x34  
p1+3 --> 0x12  
p1+4 --> 0x00  
p1+5 --> 0x00  
p1+6 --> 0x00  
p1+7 --> 0x00  
...  

この時、
execvp(p0,p1+0)である。

メモリについて

メモリについてのメモ。

メモリは1番地ごとに1byteの空間をもっている。
0x12345678 -> 0xaa
0x12345679 -> 0xaa
0x1234567a -> 0xaa
0x1234567b -> 0xaa
4byte単位で区切った際のひとつひとつを「1語」「1ワード」と言ったりする。
0x12345678 -> 0xaabbccdd
0x1234567c -> 0xaabbccdd
0x12345680 -> 0xaabbccdd
0x12345684 -> 0xaabbccdd
0x12345688 -> 0xaabbccdd
0x1234568c -> 0xaabbccdd
0x12345690 -> 0xaabbccdd

型について

  • char -> BYTE型:1byte
  • short -> WORD型:2byte
  • int -> DWORD型:4byte

配列について

char array[] = {‘a’, ‘b’, ‘c’, 0};
0x12345678 -> 'a'
0x12345679 -> 'b'
0x1234567a -> 'c'
0x1234567b -> 0x00
  • array = 0x12345678
  • array[0] = *(array + 1*0) = *(0x12345678 + 0) = “a”
  • array[1] = *(array + 1*1) = *(0x12345678 + 1) = “b”
  • array[3] = *(array + 1*3) = *(0x12345678 + 3) = 0x00
int array[] = {8, 255, 1024};
0x12345678 -> 0x00000008
0x1234567c -> 0x000000ff
0x12345680 -> 0x00000400
  • array = 0x12345678
  • array[0] = *(array + 4*0) = *(0x12345678 + 0) = 0x00000008
  • array[1] = *(array + 4*1) = *(0x12345678 + 4) = 0x000000ff
  • array[2] = *(array + 4*2) = *(0x12345678 + 8) = 0x00000400

連続宣言時の挙動

  • char arrayA [ ] = {‘a’, ‘b’, ‘c’};
  • char arrayB [ ] = {’d', ‘e’, ‘f’};
  • arrayA[0]: *0x12345678 = ‘a’
  • arrayA[1]: *0x12345679 = ‘b’
  • arrayA[2]: *0x1234567a = ‘c’
  • arrayB[0]: *0x1234567b = ’d'
  • arrayB[1]: *0x1234567c = ‘e’
  • arrayB[2]: *0x1234567d = ‘f’
実はこんなこともできる
arrayA: 0x12345678
arrayB: 0x1234567b
arrayB[0]: *(arrayB + 1*0) = *(0x1234567b + 0) = *0x1234567b = 'd'
arrayA[3]: *(arrayA + 1*3) = *(0x12345678 + 3)   = *0x1234567b = 'd'
arrayA[4]: *0x1234567c = 'e'
arrayA[5]: *0x1234567d = 'f'

実際に配列宣言時のメモリの中身を覗くプログラムをC言語で書いてみた

// memory.c

#include <stdio.h>
int main(void){
    int hoge[] = {111,222,333,444};
    int fuga[] = {555,666,777,888};
    printf("[+] int hoge[] = {111,222,333,444};\n");
    printf("[+] int fuga[] = {555,666,777,888};\n\n");
    printf("hoge   : %p\n", hoge);
    printf("fuga   : %p\n", fuga);
    printf("hoge[0]: %d\n", hoge[0]);
    printf("hoge[1]: %d\n", hoge[1]);
    printf("hoge[2]: %d\n", hoge[2]);
    printf("hoge[3]: %d\n", hoge[3]);
    printf("fuga[0]: %d\n", fuga[0]);
    printf("fuga[1]: %d\n", fuga[1]);
    printf("fuga[2]: %d\n", fuga[2]);
    printf("fuga[3]: %d\n\n", fuga[3]);
    printf("hoge    : %p -> %d\n", hoge, hoge[0]);
    printf("&hoge[0]: %p -> %d\n", &hoge[0], hoge[0]);
    printf("fuga    : %p -> %d\n", fuga, fuga[0]);
    printf("&fuga[0]: %p -> %d\n\n", &fuga[0], fuga[0]);
    printf("&hoge[0]: %p -> %d  (0x%08x)\n", &hoge[0], hoge[0], hoge[0]);
    printf("&hoge[1]: %p -> %d  (0x%08x)\n", &hoge[1], hoge[1], hoge[1]);
    printf("&hoge[2]: %p -> %d  (0x%08x)\n", &hoge[2], hoge[2], hoge[2]);
    printf("&hoge[3]: %p -> %d  (0x%08x)\n\n", &hoge[3], hoge[3], hoge[3]);
    printf("&hoge[4]: %p -> %d  (0x%08x)\n", &hoge[4], hoge[4], hoge[4]);
    printf("&hoge[5]: %p -> %d  (0x%08x)\n", &hoge[5], hoge[5], hoge[5]);
    printf("&hoge[6]: %p -> %d  (0x%08x)\n\n", &hoge[6], hoge[6], hoge[6]);
    printf("&fuga[0]: %p -> %d  (0x%08x)\n", &fuga[0], fuga[0], fuga[0]);
    printf("&fuga[1]: %p -> %d  (0x%08x)\n", &fuga[1], fuga[1], fuga[1]);
    printf("&fuga[2]: %p -> %d  (0x%08x)\n", &fuga[2], fuga[2], fuga[2]);
    return 0;
}
$ gcc -o memory memory.c
$ ./memory

/* ######### 出力結果 ########## */

[+] int hoge[] = {111,222,333,444};
[+] int fuga[] = {555,666,777,888};

hoge   : 0x7fff2df76c10
fuga   : 0x7fff2df76c20
hoge[0]: 111
hoge[1]: 222
hoge[2]: 333
hoge[3]: 444
fuga[0]: 555
fuga[1]: 666
fuga[2]: 777
fuga[3]: 888

hoge    : 0x7fff2df76c10 -> 111
&hoge[0]: 0x7fff2df76c10 -> 111
fuga    : 0x7fff2df76c20 -> 555
&fuga[0]: 0x7fff2df76c20 -> 555

&hoge[0]: 0x7fff2df76c10 -> 111  (0x0000006f)
&hoge[1]: 0x7fff2df76c14 -> 222  (0x000000de)
&hoge[2]: 0x7fff2df76c18 -> 333  (0x0000014d)
&hoge[3]: 0x7fff2df76c1c -> 444  (0x000001bc)

&hoge[4]: 0x7fff2df76c20 -> 555  (0x0000022b)
&hoge[5]: 0x7fff2df76c24 -> 666  (0x0000029a)
&hoge[6]: 0x7fff2df76c28 -> 777  (0x00000309)

&fuga[0]: 0x7fff2df76c20 -> 555  (0x0000022b)
&fuga[1]: 0x7fff2df76c24 -> 666  (0x0000029a)
&fuga[2]: 0x7fff2df76c28 -> 777  (0x00000309)

/* ############################# */

pwn,rop,/bin/sh,shell(),ファイルディスクリプタについて

・サーバ側でshellを開く
buf += '/bin/sh\x00'

・サーバ側のshellをこちらで開く
buf += '/bin/sh <&4 >&4 2>&4;'
shell()

動的リンク、遅延バインドについて

遅延バインドについて
@plt一行目 : jmp (.got.pltを参照するアドレス)
@plt二行目 : push (.rel.pltの中の書き換えが必要な行数)
@plt三行目 : jmp (.pltセクションの先頭)
.pltセクション一行目 : push (動的リンクの際に必要なパラメータ)
.pltセクション二行目 : jmp (動的リンカのアドレス)

ELFのセクションについて

たぶんこんな感じなんだと思う。たぶん。

 

ELFヘッダ : MagicNumber, bit, エンディアン, CPU, 後続のヘッダへのポインタ

プログラムヘッダ : ローダのための情報。つまりセグメントの情報と動的リンク関係が格納。
.interp : インタープリタのファイルパスが格納
.hash : ハッシュ値とシンボルアドレスのハッシュテーブル。
.dynsym : .hashでハッシュ化されたシンボル名(ハッシュ値)とシンボル情報(シンボルアドレスやシンボル名など)のテーブル。
.dynstr : .dynsymから参照したシンボル名が格納。.dynamicから参照した共有ライブラリのファイル名が格納。
.rel.plt : 動的リンクのために書き換えが必要なアドレス(.plt一行目のアドレス)とシンボル情報のリスト。
.plt : .textから共有ライブラリ内の関数へ飛ぶ際の中継点。
.text : 機械語コードが格納。
.dynamic : 動的リンクに必要な情報が格納。共有ライブラリの名前や.hashのアドレス、.dynstrのアドレス、.dynstrのサイズなどなど。
.got.plt : .plt一行目のjmp先のアドレス(書き換え先アドレス)と共有ライブラリ内の関数のアドレス(書き換えアドレス)のテーブル
.shstrtab : セクション名の文字列リスト。
セクションヘッダ : セクションの情報が格納。