• 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

VPS Starter Arubacloud
+5 głosów
824 wizyt
pytanie zadane 1 marca 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 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,750 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,750 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 583 wizyt
pytanie zadane 25 września 2022 w Nasze projekty przez Mirosław Zelent Nałogowiec (34,750 p.)
+7 głosów
5 odpowiedzi 2,140 wizyt
pytanie zadane 15 maja 2020 w Bezpieczeństwo, hacking przez Mirosław Zelent Nałogowiec (34,750 p.)
+2 głosów
1 odpowiedź 354 wizyt
pytanie zadane 11 stycznia 2022 w Algorytmy przez samek Nowicjusz (180 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...