Notice
Recent Posts
관리 메뉴

Hacking Arts

[intel][x64] Stack 기반 BOF 본문

System/BOF

[intel][x64] Stack 기반 BOF

Rakehell 2015. 10. 22. 02:53

0x01 x86과 x86_64의 차이점

메모리 주소크기가 64비트이지만 첫 47비트 공간만을 사용한다 그래서 0x00007fffffffffff 보다 큰 주소값을 지정했다가는 예외가 발생한다고 한다. 0x4141414141414141은 얘외가 발생하고 0x0000414141414141은 예외가 발생하지 않는다고 합니다. 즉 이게 문제인점은 우리가 만일 4개의 바이트를 빼고 덮으면 예외가 되지않고 정상실행이 되는거네요 퍼징할때는 아무래도 그냥 무작정 덮는데 만일 4byte를 빼고 퍼징이 돌려지면 취약점이 아닌것처럼 보여질수도 있겠다는 얘기가 되겠네요

 

0x02 취약한 코드

`

이렇게 됩니다. 기본적으로 64bit환경에는 메모리 보호기법이 포함되어있어서 stack기반으로는 될수 없다고 보면됩니다. 그래서 컴파일할때 빼줘야됩니다. gcc -m64 bof.c -o bof -z execstack -fno-stack-protector를 통해서 nx와 ssp를 제외시키는 거라고 보면됩니다.

그다음 코드를 보겠습니다.

이제 call하는 방식을 보면 rdi,rsi를 사용한다 글은 http://gatsby-study.tistory.com/363을 보면 알 수 있다. 콜링할때 기존에 x86에서 사용하던 푸쉬방식을 쓰지않는다.

 

뭐 실행을 ret를 이전에 얘기했듯이 전부 덮게되면 예외가 발생하게된다. 즉 우리는 rsp를 잘바꾸기 위해선 값을 잘넣어야된다 앞에 2byte를 뺀 6byte만 사용해야된다.

r `perl -e'print"A"x264,"B"x6'`했을때 덮는 모습이다.

rsp 가 0x0000424242424242로 바뀐다.

 

하다가 안되서 졸려서 그냥 잤는데... 이제보니까 ASLR을 종료 안시켜서 그런것같다. 그때 어땟는지 솔직히 지금 잘기억나지않아 모르지만 그랬을거라고 생각하고있다. 

어차피 쉘 올리는거야 같다고 생각

하고 환경변수나 스택이나 상관없다 이런식으로 올려서 하면 됬다.

 

이건 스택으로

 

이처럼 하면 올라갈수있네요 ㅎㅎ

flag도 읽을 수 있구요 이걸로 완성!

 

'System > BOF' 카테고리의 다른 글

[intel][x64] RTL(Return To libc)  (0) 2015.10.31
[intel][x86] ROP  (2) 2015.09.29
[MIPS][x86] BOF 기본 공격 방식  (0) 2015.08.17
[MIPS][x86] BOF 분석  (0) 2015.08.17
BOF 개론  (0) 2014.08.27