예전에 과제로 했던 proxy-server 보다도 시간이 오래 걸린거 같다. 뭔가 생각지 않은 상황도 너무 많았고 여타 다른 바이너리와는 다른 부분도 너무 많았다.심지어 보호기법도 많았다! NX-Bit, SSP, PIE가 걸려있었고 내부적으로 fork를 쓰는거 같아 Canary와 binary-base의 주소는 바뀌지 않았다.즉 한번만 구해놓으면 된다는 것인데, 사실 한번구하면 계속 구할 수 있기 때문에 큰 메리트는 아니다. 일단 우리가 알아내야 할 건 총 3가지이다. 랜덤값으로 이루어진 Password, 역시 랜덤한 canary 또 랜덤한 binary-base address.총 3개를 leak해야 하고 canary와 base address는 기존에 해왔던 방식으로 브루트 포싱했다. for(bytes_wr..
ASLR + NX Bit가 걸려있는 ROP문제이다. 사실 ROP만 문제였다면 굉장히 쉬웠겠지만. 조금 어려운 문제들은ROP + 부수적인 제한들이 걸려 있어서 그것들을 넘어가는게 약간 힘들다. 이 문제에선 JSON과 HMAC, HashCollision에 대해서 배울 수 있었다.삽질을 학교에서부터 집까지 했는데 유익한 문제였던것 같다. 일단 ADD 가젯과 pop ebx, pop eax가젯이 모두 있기 때문에 (ropshell.com에서 확인 가능)got를 이용해서 system을 실행시키는건 굉장히 쉬웠다. gContents의 값을 system 함수의 인자로 하려 했으나 gContents가 2중포인터여서불가능했다. 그렇다고 memcpy로 command를 한바이트씩 찾아서 복사하려니 굉장히 귀찮아서 srand@..
xor를 할때 값에 0x00을 주면 자신이 나옴 0x50 ^ 0x00 = 0x50 그래서 keybuf의 값 128(sizeof int * 32)을 모두 0x00으로 주고 keybuf를 구했음. 사실 처음에 이 문제를 풀었을때는 system함수 구해서 풀었는데 IDA로 까보니까 execve.plt가 있었다. 그래서 .bss section에 read로 execve의 인자값이 될 "/bin/sh", {"/bin/sh", 0}를 만들어두고 execve의 인자값을 bss영역의 주소로 줬음 확실히 system 구하는것보다 깔끔하게 나옴
ASLR 걸려있고 buffer 주소를 출력해 주지 않는다. fusion 내부에 있는 ROPgadget 프로그램을 이용하면 jmp *%esp를 쉽게 찾을 수 있다. ret 바로 뒤 4바이트로 점프하게 되고 esi에 우리가 넣은 쉘코드가 위치하게 됨 ret뒤 4바이트에다 jmp *%esi opcode넣어주고 ret를 jmp *%esp로 주면 쉘 획득 가능 https://gist.github.com/err0rless/49c2b54554dc67fd2bb3