본문 바로가기

시스템 해킹100

start_hard-64비트 SROP, 브루트포스 이 문제는 어..려....웠......다.......주어진 것은 read함수 뿐!먼저, 64비트는 int 80이 아닌 syscall을 쓰는 것을 몰랐었다.->이후, syscall을 써야 함을 깨닫긴 했으나,vsyscall에 있는 syscall을 사용하려 했다.->vsyscall은 마치 executable한 것 처럼 보이지만, 내부에서 엄청나게 복잡한 일이 벌어지면서segmentation fault를 띄운다. 실함수 주소가 뒤12비트는 고정됨을 이용! 확률 1/32로 syscall 브루트 포싱!64비트 SROP에서는 execve함수는 rax에 0x3b가 들어가고, rdi에 /bin/sh문자열 주소가 들어가면 된다!from pwn import *import time syscallret=0xffffffffff.. 2018. 1. 9.
scv-64비트, C++, ROP, 카나리릭, libc릭 64비트, C++, ROP, 카나리릭, libc릭- 아주 간단한 카나리릭, libc릭 문제였다.C++형태이고, 64비트 문제라서 조금 생소했다. read를 하고, 입력 받은 것을 출력해주는데, 이때 릭을 했다.카나리릭+libc릭->카나리와 /bin/sh주고, system주소 알아낼 수 있다.+)카나리는 항상 \x00으로 끝난다! 리턴어드레스에는 pop rdi; ret을 넣어준다.64비트에서는 함수 호출규약이 조금 다르다. 스택기반이 아닌 레지스터로! rdi로 들어간다. 그래서 pop rdi; ret;을 이용해서 rdi에 /bin/sh주소를 넣어주고, 그 다음 리턴 어드레스에 system주소를 넣어준다! from pwn import * prdir=0x400ea3 #pop rdi; ret s=process(.. 2018. 1. 6.
enjoy_rop-ROP+SROP SROP+ROP- SROP문제! 문제는 아주 간단하다. sys_read를 매우 길게 받는다.execve를 호출하기 위해서는eax를 11로 만들고, ecx와 edx는 널바이트로 채우고, ebx에는 /bin/sh문자열의 주소가 들어가야 한다.문제에서 스택의 주소를 주기 때문에, read를 받을 때, /bin/sh\x00을 주고 그 주소를 알아낼 수 있다. pop eax라는 가젯이 없으므로, eax는 read로 받아들이는 byte로 바꿔준다.하지만, return address를 덮어야 하므로, 11만큼 read하면 return address를 덮을 수 없다. 따라서, 다시 앞으로 돌리는 작업이 필요하다. 처음에는 /bin/sh만 넣어주고 뒤쪽에 가젯들을 넣어준다음에다시 돌아왔을 때는 read를 이용해 eax를.. 2018. 1. 6.
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.