• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Challenge CTF - Oszukane płatności kartą, algorytm Luhna

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+5 głosów
694 wizyt
pytanie zadane 1 marca 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,640 p.)

To jest wątek ogłoszony w tym odcinku CTF(7):

https://www.youtube.com/watch?v=1Arn3mWsmlQ

Można tutaj postować swoje rozwiązania (write-upy) challenge'u:

https://ctflearn.com/challenge/970

wykonane w przeróżnych językach programowania.

Zachęcam do zabawy - dajcie znać jakiego języka użyliście i/lub jakich zabiegów aby uprościć kod źródłowy.

komentarz 3 marca 2022 przez Kajman6679 Nowicjusz (180 p.)

Napisałem kod w VBA (bo czemu nie :)

Sub The_Credit_Card_Fraudster()

Dim i As Long
Dim text As String

For i = 0 To 999999


    text = "543210" & LeftPad(CStr(i)) & "1234"

    If Modulus(CDbl(text), 123457) = 0 Then
        If Modulus(luhna(text), 10) = 0 Then
            Debug.Print text
        End If
    End If
Next

End Sub

Function luhna(liczba As String)
Dim waga As Integer
Dim suma As Integer
Dim i As Integer

suma = 0
waga = 1

For i = Len(liczba) To 1 Step -1
    
    If waga = 1 Then
        suma = suma + waga * CInt(Mid(liczba, i, 1))
        waga = 2
    Else
        If Mid(liczba, i, 1) * waga > 9 Then
            suma = suma + (waga * CInt(Mid(liczba, i, 1)) - 9)
        Else
            suma = suma + waga * CInt(Mid(liczba, i, 1))
        End If
        waga = 1
    End If
Next

luhna = CDbl(suma)

End Function

Function Modulus(a As Double, b As Double)
   Modulus = a - (b * VBA.Int(a / b))
End Function

Function LeftPad(str As String)
  Do While Len(str) < 6
    str = "0" & str
  Loop
  LeftPad = str
End Function

 

komentarz 4 marca 2022 przez Mirosław Zelent Nałogowiec (34,640 p.)
Super, fajna realizacja, nie spodziewałem się VBA :) Pozdrawiam serdecznie
1
komentarz 6 marca 2022 przez bl4ckhatkitty Nowicjusz (100 p.)

skorzystałem z pythona

beginning = str(543210)
end = str(1234)

checksum = 0

for i in range(999999):
    mid = (str(i).zfill(6))
    card_number = beginning + mid + end
    for p in range(len(card_number)):
        if p % 2 == 0:
            supp = int(card_number[p]) * 2
            if supp == 10:
                checksum += 1
            elif supp == 12:
                checksum += 3
            elif supp == 14:
                checksum += 5
            elif supp == 16:
                checksum += 7
            elif supp == 18:
                checksum += 9
            else:
                checksum += supp

        else:
            checksum += int(card_number[p])
        
    if int(card_number) % 123457 == 0:
        print(card_number, " checksum : ", checksum)
    
    checksum = 0

 

komentarz 6 marca 2022 przez Emil22019 Nowicjusz (100 p.)

Tylko że wychodzi

komentarz 6 marca 2022 przez bl4ckhatkitty Nowicjusz (100 p.)
no i jest jedna suma kontrolna podzielna przez 10
komentarz 8 marca 2022 przez Emil22019 Nowicjusz (100 p.)

 @Emil22019 , No i jest kilka wyników

 

3 odpowiedzi

+2 głosów
odpowiedź 6 marca 2022 przez Dominik Piotrowicz Użytkownik (740 p.)

Napisałem w C#. Zdaję sobie sprawę, że przy tak dużych łańcuchach powinno się użyć StringBuildera, ale na tym etapie nauki jeszcze nie potrafię konwersji. :)

        static int LuhnCheck(string nr)
        {
            int weight = 1;
            string score = "";
            int ratio;

            for (int i = nr.Length - 1; i >= 0; i--)
            {
                if (weight == 1)
                {
                    score += int.Parse(nr[i].ToString());
                    weight = 2;
                }
                else
                {
                    ratio = int.Parse((nr[i]).ToString()) * 2;

                    if (ratio > 9)
                    {
                        ratio = (ratio / 10) + ratio % 10;
                    }

                    score += ratio;
                    weight = 1;
                }
            }

            int checksum = 0;

            for (int i = 0; i < score.Length; i++)
            {
                checksum += int.Parse(score[i].ToString());
            }

            return checksum;
        }

        static string Search_six(string nr)
        {
            int guess = 0;
            string check = "";
            string result = "";

            for (int i = 0; i <= 999999; i++)
            {
                string guesser = guess.ToString();

                guesser = i.ToString().PadLeft(6, Char.Parse("0"));

                check = nr.Substring(0, 6) + guesser + nr[12..];

                long checkLong = (long)Int64.Parse(check);

                if (checkLong % 123457 == 0 && LuhnCheck(check) % 10 == 0)
                {
                    result += checkLong + "\n";
                }
            }
            return result;
        }

        static void Main()
        {
            string card= "543210******1234";
            string card_test = "7155032979402154";

            Console.WriteLine(LuhnCheck(card_test));
            Console.WriteLine(Search_six(card));
            Console.ReadKey();
        }

 

+1 głos
odpowiedź 1 maja 2022 przez MemeRistor Nowicjusz (160 p.)

Poleciałem pythonem bo staram się wszystko w nim obecnie pisać

looked_card = "543210******1234"

for guess in range(int(str(9)*6)): #leń ze mnie wyszedł w tym range()
  proposed_card = int(  looked_card[:6] + str(guess).zfill(6) + looked_card[-4:]  )
  if(luhn_alg(proposed_card) and proposed_card%123457 == 0):
    print(proposed_card) 

def luhn_alg(card_number):
  waga = 2 if len(str(card_number))%2==0 else 1
  suma = 0
  for digit in str(card_number):
    suma += int(digit)*waga if int(digit)*waga < 10 else -9
    waga = 1 if waga == 2 else 2
  return True if suma%10 == 0 else False

 

komentarz 2 maja 2022 przez Mirosław Zelent Nałogowiec (34,640 p.)

Super, gratuluję smiley

+1 głos
odpowiedź 5 października 2022 przez jezierski Nowicjusz (160 p.)

Moje wypociny w C++

#include <iostream>

using namespace std;

bool luhn(long long karta)
{
    string s=to_string(karta);
    int suma=0, pom;
    for(int j=0; j<s.length(); j++)
    {
        if(j%2==0)
        {
            pom=2*(s[j]-48);
            if(pom>9)
            {
                pom-=9;
            }
        }
        else
        {
            pom=s[j]-48;
        }
        suma+=pom;
    }
    if(suma%10==0)
        return 1;
    else
        return 0;
}

int main()
{
    long long numer;

    for(long long i=0; i<1000000; i++)
    {
        numer=i*10000+5432100000001234;
        if(numer%123457==0 && luhn(numer))
            cout<<numer<<endl;
    }
}

 

Podobne pytania

+2 głosów
2 odpowiedzi 366 wizyt
pytanie zadane 25 września 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,640 p.)
+7 głosów
5 odpowiedzi 1,701 wizyt
pytanie zadane 15 maja 2020 w Bezpieczeństwo, hacking przez Mirosław Zelent Nałogowiec (34,640 p.)
+2 głosów
1 odpowiedź 202 wizyt
pytanie zadane 11 stycznia 2022 w Algorytmy przez samek Nowicjusz (180 p.)

91,276 zapytań

139,942 odpowiedzi

315,129 komentarzy

60,722 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...