시스템 해킹/cykor26 rop2-ROP+SROP rop+srop- ROP2문제는 작년에도 풀었다.작년에는 가젯을 이용해서 got에 담긴 실제함수값의 주소를 바꿨다면, 이번에는 SROP를 이용했다. gadget2와 gadget1을 이용해서 bss영역에 /bin/sh 를 박아줄 수 있다.bss영역은 처음부터 null로 채워져 있으니까, add에다가 (0x6e69622f)와 (0x68732f2f)을 해줘서 /bin//sh를 만들어줄 수 있다. 그 다음, eax에 119를 넣어줘서->sigreturn sigreturn이 실행될 때, 스택에 있는 값들이 레지스터에 pop되는데,여기서 eax는 11이 되도록, eip는 int 80이 되도록, 그리고, CS와 SS를 맞춰줘야 한다. CS와 SS에 값 때문에 계속 Segmentation Fault가 떴다. 64비트에.. 2018. 1. 5. rop1-ROP+SROP 작년에는 이 문제가 그냥 hello world를 출력하는게 문제였는데,이번에는 쉘까지 땄다. 바로, SROP를 이용하면 된다! SROP를 이용하기 위해서는 일단 /bin/sh의 문자열이 필요하다.이는 작년에 풀었던 것처럼 주어진 가젯을 이용했다. popa와 rep stosd를 이용했는데 popa로 레지스터값을 조정하고, rep stods로 원하는 곳에 /bin/sh를 적었다. rep - ecx stosd - eax, edi 이런식으로 연결된다고 보면 된다. rep -> ecx값 만큼 반복적으로 명령을 수행 stosd -> eax에 담긴 값을 edi에 복사함 출처: http://msparkms.tistory.com/entry/4Byte-Memset-구현 [MSPark's Blog] 그 다음, SROP를 이.. 2018. 1. 2. 2015410212-64비트 쉘코드, 간단한 xor 64비트 쉘코드, 간단한 xor- 취약점은 main함수에 있는 call rdx 여기서 rdx는 addr에 담긴 값(0x616267307264)이다 init함수에서 이 부분은 rwxp의 권한을 갖게 된다. 따라서, 이 곳에 쉘코드를 넣어주면 된다! Enter your code: 해서 이 곳에 원하는 만큼 입력을 받는다. 하지만 문제는 mapping부분에서 xor로 이 부분을 망쳐놓는다는 점이다. 따라서, 어떻게 xor이 이루어지는지를 분석해서 코드를 짜서 쉘을 따는 데에 성공했다. 이 부분은 간단한 xor연산 과정이다! from pwn import *payload=""shellcode="\x50\x48\x31\xd2\x48\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x6.. 2018. 1. 2. rain_dROP-카나리 릭, 메모리 릭 rain_dROP문제는 main함수와 WriteName함수, ReadName함수로 이루어져 있다. WriteName함수에서 입력을 받는다. 그리고 *MK_FP(__GS__, 20)부분이 있는데, 마지막에 특정 메모리 영역이 조작되어 있는지 아니면 기존의 값을 잘 유지하고 있는지 확인해준다. ReadName함수에서는 Name을 출력해주는데, 이때, 뒤에 나오는 메모리도 같이 딸려 나올 수 있도록 메모리 릭을 해준다. 128자를 채워주면 바로 뒤에 나오는 4바이트가 카나리 영역이다. 이 부분을 건드리지 않은 채로 ReadName함수로 넘어가는데, 이렇게 ReadName에서 카나리 영역을 알아내고, 그 다음 4바이트가 나오고 그 바로 다음 4바이트는 f7~로 시작하는 libc기반 주소가 나온다. 이렇게 카나리.. 2018. 1. 2. derby-카나리 릭 derby문제에서 아이다로 확인을 하면, 큰 입력을 받는 부분(read(0,s,0x134u)이 game()&&(unsigned int)score > 0x1D979의 if문을 통과해야 도달할 수 있다. game()이 참이 되려면, game함수에서 return값이 1이 되어야 하고, 이는 7번 메뉴를 선택해야 한다. 7번 메뉴는 숨겨진 메뉴라고 볼 수 있다. score또한 조건을 만족해야 하므로, 100%의 확률로 도달할 수 있는 것은 아니다. 이때 read함수로 입력을 크게 받으므로 return address까지 덮을 수 있다. 하지만 문제는 이 부분을 통과해야 조작한 리턴 어드레스에 도달할 수 있다는 점이다. 우리는 random_bak에 적힌 값을 알아야 한다. read(0,s,0x134u)부분에서 s는.. 2018. 1. 2. 2015410208-got overwrite 취약점은 v2*v2>1600만 확인하는 부분이다!그렇다면 음수나 0이어도 상관이 없다는 것이다! v2+40*v1+0x804a0a0=count를 이용하자v1에 0을 넣고 v2에는 원하는 음수 값을 넣으면 got overwrite이 가능하다(count는 v0, v1,에 0을 넣는 것을 반복하여 원하는 count를 만들어줄 수 있다.) system이 주어졌으므로, fgets의 got 2018. 1. 2. daRk_TempLer-read함수의 null daRk_TempLer문제는 main함수와 check함수로 이루어져 있다.main함수에서는 Input size를 입력받고, 그 인풋사이즈만큼 read함수를 이용해서 input을 buf에 입력받는다. buf의 길이는 0x40을 넘으면 안된다. check함수에서 buf는 $&;|`\\> ") s.send("1000\n") time.sleep(1) s.recv(1024) s.send("id"+"\x00"+"A"*73+"\xc0\x84\x04\x08"+"\xef\xbe\xad\xde"+"\x3f\x89\x04\x08") 2017. 12. 29. catchme-노가다, 스택버퍼오버플로우 이 문제는 0x40080D부터 시작을 한다. 0x400D23->0x400CE50>0x400CA7->0x400C69->0x400C2B->0x400BED->0x400BAF->0x400B71->0x400B33->0x400AF5->0x400AB7->0x400A79->0x400A3B->0x4009FD->0x4009C4->0x400994를 거치면 Stage-1 clear!를 출력할 수 있다. 0x400994부분에 gets(&v1) 부분이 취약점이다. V1은 ebp-0x10에 위치하고 길이를 공격자 마음대로 줄 수 있으므로 리턴어드레스 부분을 덮을 수 있다. 처음에는 스택버퍼오버플로우를 이용하려 했지만, 스택영역에 실행권한이 주어지지 않았으므로 할 수 없었다. 0xx400984부분에 system(“/bin/sh”)를.. 2017. 12. 29. 20121209-메모리 릭, fake ebp 이 문제의 구조 1) 주소를 입력받아서, 그 주소에 담긴 값을 출력2) 0x48만큼 read함수로 입력을 받아서, strcpy진행 후 printf3) 주의사항: 0x48입력받을때 0x38부터 pop ebp위치 0x3c는 return address 1->이미 실행된 함수의 got주소를 준다(실제 함수주소가 담겨있다) => libc주소를 알 수 있다.=>system주소, /bin/sh주소 구할 수 있다 2->0x3c뒤에 main함수의 주소를 줘서 다시 메인으로 돌리며 0x48을 꽉채워서 메모리 입력을 줌=>메인으로 돌아가면서, 메모리 릭 가능여기서 릭 되는 메모리는 stack주소 물론! libc주소도 릭되지만, 1번에서 했으므로 스택주소만 이용!*1번을 이용해서 스택주소를 알아내는 방법은 생각하지 못했다. .. 2017. 12. 29. 이전 1 2 3 다음